Si ejecuto este comando find $HOME/MySymlinkedPath -name "run*.sh"
no sucede nada y no aparece ningún error ('MySymlinkedPath' es una ruta con enlace simbólico a otro disco duro que no sea mi $HOME).
Estos también fallan:
find ~/MySymlinkedPath -name "run*.sh"
find /home/MyUserName/MySymlinkedPath -name "run*.sh"
Y solo para estar seguro, esta ruta inexistente falla (por supuesto), find $HOME/MySymlinkedPathDUMMYTEST -name "run*.sh"
por lo que se encuentra la ruta (porque ese error no ocurre) pero find
no se realiza la búsqueda, y ahora no tengo ni idea.
Solo funciona si cd $HOME/MySymlinkedPath
primero elimino la referencia de ruta de esta manera, find -name "run*.sh"
pero eso no es bueno para mis scripts.
Una información adicional:
este comando funciona como de costumbre ls $HOME/MySymlinkedPath/run*.sh
, y si voy allí cd $HOME/MySymlinkedPath
y lo ejecuto, ls ..
el resultado no es el que esperaba - la lista de la ruta donde se encuentra la ruta enlazada simbólicamente - devuelve la lista de la ruta real en el otro medio /¡¡¡disco duro!!!
pwd -P
/media/MediaIdentifier/RealPath
pwd
/home/MyUser/MySymlinkedPath
Repensar:
¿Es esto un problema con find
y ls
o con mi sistema? ¿O es lo esperado y no es ningún problema? Estoy en Ubuntu 12.10. Falla en todos los terminales que probé, por lo que no parece un "problema" de terminal.
Respuesta1
Aquíes la respuesta. Pero esa pregunta apunta a bash como el objetivo del problema.
La explicación es que find
se encuentra "$HOME/MySymlinkedPath"
. Es un enlace simbólico, no un directorio, por lo que el descenso recursivo se detiene allí. Si la expresión coincide "$HOME/MySymlinkedPath"
(por ejemplo, en find "$HOME/MySymlinkedPath" -name 'My*'
), find
se imprimirá como una coincidencia.
Como se señaló allí, descubrí que la forma más fácil y limpia de solucionarlo y corregir todos los scripts es, en lugar de:
find "$HOME/MySymlinkedPath" -name "run*.sh"
simplemente agregue una barra, de modo que find
no comience desde el enlace simbólico sino desde el destino del enlace simbólico:
find "$HOME/MySymlinkedPath/" -name "run*.sh"
Alternativamente, pase la -H
opción a find
(tenga en cuenta que debe aparecer primero, antes de las rutas) para indicarle que atraviese los enlaces simbólicos pasados en su línea de comando. (Esto también es diferente de -L
lo que indica que se deben atravesar enlaces simbólicos encontrados durante el descenso recursivo).find
find -H "$HOME/MySymlinkedPath" -name "run*.sh"
Y finalmente funcionó mejor aquí -L
(debido a los varios sistemas de archivos que he vinculado simbólicamente a través de carpetas). Pero genera muchos mensajes de error no problemáticos, así que agregué 2>/dev/null
; y también decidió crear este alias alias find='find -L'
:
find -L "$HOME/MySymlinkedPath" -name "run*.sh" 2>/dev/null