Sugeriría encarecidamente no usar find -L para la tarea (ver más abajo para una explicación). Aquí hay algunas otras formas de hacer esto:
Si desea utilizar un findmétodo "puro ", debería verse así:
find . -xtype l
( xtypees una prueba realizada en un enlace desreferenciado) Sin findembargo, esto puede no estar disponible en todas las versiones de . Pero también hay otras opciones:
También puede ejecutar test -edesde el findcomando:
find . -type l ! -exec test -e {} \; -print
Incluso algún greptruco podría ser mejor (es decir, más seguro ) que find -L, pero no exactamente como se presenta en la pregunta (que engloba en líneas de salida completas, incluidos los nombres de archivo):
find . -type l -exec sh -c 'file -b "$1" | grep -q ^broken' sh {} \; -print
El find -Ltruco citado por solo de commandlinefu se ve lindo y hacky, pero tiene una trampa muy peligrosa : se siguen todos los enlaces simbólicos. Considere el directorio con los contenidos presentados a continuación:
$ ls -l
total 0
lrwxrwxrwx 1 michal users 6 May 15 08:12 link_1 -> nonexistent1
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_2 -> nonexistent2
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_3 -> nonexistent3
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_4 -> nonexistent4
lrwxrwxrwx 1 michal users 11 May 15 08:20 link_out -> /usr/share/
Si ejecuta find -L . -type len ese directorio, /usr/share/también se buscarán todos (y eso puede llevar mucho tiempo) 1 . Para un findcomando que es "inmune a los enlaces salientes", no lo use-L .
1 Esto puede parecer un inconveniente menor (el comando "solo" tardará mucho en atravesar todo /usr/share), pero puede tener consecuencias más graves. Por ejemplo, considere entornos chroot: pueden existir en algún subdirectorio del sistema de archivos principal y contener enlaces simbólicos a ubicaciones absolutas. Es posible que esos enlaces parezcan estar rotos para el sistema "externo", ya que solo apuntan a los lugares apropiados una vez que ha ingresado al chroot. También recuerdo que algunos gestores de arranque usaron enlaces simbólicos en /bootese sentido solo en una fase de arranque inicial, cuando la partición de arranque se montó como /.
Entonces, si usa un find -Lcomando para buscar y luego eliminar enlaces simbólicos rotos de algún directorio de aspecto inofensivo, incluso podría romper su sistema ...
-type les redundante ya-xtype lque funcionará como-type len no enlaces. Asífind -xtype les, probablemente, todo lo que necesita. Gracias por este enfoque.