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 find
método "puro ", debería verse así:
find . -xtype l
( xtype
es una prueba realizada en un enlace desreferenciado) Sin find
embargo, esto puede no estar disponible en todas las versiones de . Pero también hay otras opciones:
También puede ejecutar test -e
desde el find
comando:
find . -type l ! -exec test -e {} \; -print
Incluso algún grep
truco 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 -L
truco 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 l
en ese directorio, /usr/share/
también se buscarán todos (y eso puede llevar mucho tiempo) 1 . Para un find
comando 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 /boot
ese sentido solo en una fase de arranque inicial, cuando la partición de arranque se montó como /
.
Entonces, si usa un find -L
comando para buscar y luego eliminar enlaces simbólicos rotos de algún directorio de aspecto inofensivo, incluso podría romper su sistema ...
-type l
es redundante ya-xtype l
que funcionará como-type l
en no enlaces. Asífind -xtype l
es, probablemente, todo lo que necesita. Gracias por este enfoque.