Si ejecuto este comando, find $HOME/MySymlinkedPath -name "run*.sh"
no sucede nada y no da ningún error ('MySymlinkedPath' es una ruta enlazada 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 asegurarme, 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 realiza la búsqueda en ella, y ahora estoy muy despistado.
Solo funciona si cd $HOME/MySymlinkedPath
primero elimino la referencia de ruta como esta, 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 ejecuto esto, ls ..
el resultado no es lo que esperaba: la lista de la ruta donde se encuentra la ruta enlazada con enlaces simbólicos, 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 se espera y no es un problema en absoluto? Estoy en Ubuntu 12.10. Falla en todos los terminales que probé, por lo que no parece un "problema" terminal.
Respuestas:
Aquí está la respuesta. Pero esa pregunta apunta a bash como el objetivo del problema.
La explicación es que
find
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, enfind "$HOME/MySymlinkedPath" -name 'My*'
),find
se imprimirá como una coincidencia.Como se señaló allí, descubrí que la forma más fácil / limpia de tratarlo y corregir todos los scripts es, en lugar de:
simplemente agregue una barra oblicua, de modo que
find
no comience desde el enlace simbólico sino desde el objetivo del enlace simbólico:Alternativamente, pase la
-H
opción afind
(tenga en cuenta que debe venir primero, antes de las rutas) para decirle que atraviese enlaces simbólicos pasados en su línea de comando. (Esto es diferente de lo-L
que indicafind
atravesar enlaces simbólicos encontrados también durante el descenso recursivo).Y finalmente funcionó mejor aquí
-L
(debido a los diversos sistemas de archivos que he enlazado a través de carpetas). Pero genera un montón de mensajes de error no problemáticos, así que agregué2>/dev/null
; y también decidí crear este aliasalias find='find -L'
:fuente