encontrar no funciona en la ruta de enlace simbólico?


14

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 findno realiza la búsqueda en ella, y ahora estoy muy despistado.

Solo funciona si cd $HOME/MySymlinkedPathprimero 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/MySymlinkedPathy 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 findy 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.


1
Encontré una mejor respuesta "encontrar-seguir". stackoverflow.com/questions/105212/…
Jarod

La página de manual de @Jarod dice que -follow está en desuso y deberíamos usar -L (que también es -follow) como en mi respuesta a continuación:>
Aquarius Power

Respuestas:


20

Aquí está la respuesta. Pero esa pregunta apunta a bash como el objetivo del problema.

La explicación es que findencuentra "$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*'), findse 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:

find "$HOME/MySymlinkedPath" -name "run*.sh"

simplemente agregue una barra oblicua, de modo que findno comience desde el enlace simbólico sino desde el objetivo del enlace simbólico:

find "$HOME/MySymlinkedPath/" -name "run*.sh"

Alternativamente, pase la -Hopción a find(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 -Lque indica findatravesar enlaces simbólicos encontrados también durante el descenso recursivo).

find -H "$HOME/MySymlinkedPath" -name "run*.sh"

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 alias alias find='find -L':

find -L "$HOME/MySymlinkedPath" -name "run*.sh" 2>/dev/null

2
En mi humilde opinión, en general es una buena práctica utilizar una barra diagonal después de los directorios para indicar que en realidad son directorios. :) Hace las cosas más legibles, etc.
dannysauer
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.