¿Cómo puedo encontrar enlaces simbólicos rotos?

¿Cómo puedo encontrar enlaces simbólicos rotos?

¿Hay alguna manera de encontrar todos los enlaces simbólicos que no apuntan a ningún lado?

find ./ -type l

me dará todos los enlaces simbólicos, pero no hace distinción entre enlaces que van a algún lugar y enlaces que no.

Actualmente estoy haciendo:

find ./ -type l -exec file {} \; | grep broken

Pero me pregunto qué soluciones alternativas existen.

Respuesta1

Recomiendo fuertementenoutilizar find -L para la tarea (consulte la explicación a continuación). Aquí hay algunas otras formas de hacer esto:

  • Si desea utilizar un findmétodo "puro" y asumiendo la implementación GNU de find, debería verse así:

    find . -xtype l
    

    (xtypees una prueba realizada en un enlace desreferenciado)

  • De forma portátil (aunque menos eficiente), 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 aparece en líneas de salida completas, incluidos los nombres de archivos):

    find . -type l -exec sh -c 'file -b "$1" | grep -q "^broken"' sh {} \; -print
    

El find -Ltruco citadopor solodelínea de comandofuSe ve bonito y hacky, pero tiene uno muytrampa peligrosa: Se siguen todos los enlaces simbólicos. Considere el directorio con los contenidos que se presentan 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á en todo (y eso puede llevar mucho tiempo) 1 .Para un findcomando que es "inmune a los enlaces salientes", no utilice-L.


1 Esto puede parecer un inconveniente menor (el comando "simplemente" tardará mucho en recorrer todo /usr/share), pero puede tener consecuencias más graves. Por ejemplo, considere los entornos chroot: pueden existir en algún subdirectorio del sistema de archivos principal y contener enlaces simbólicos a ubicaciones absolutas. Esos enlaces podrían parecer rotos para el sistema "externo", porque sólo apuntan a lugares adecuados una vez que has ingresado al chroot. También recuerdo que algunos gestores de arranque usaban enlaces simbólicos /bootque solo tenían sentido en una fase de arranque inicial, cuando la partición de arranque estaba montada como /.

Entonces, si usa un find -Lcomando para buscar y luego eliminar enlaces simbólicos rotos de algún directorio que parece inofensivo, incluso podría dañar su sistema...

Respuesta2

Como ya comentó rozcietrzewiacz, find -Lpuede tener consecuencias inesperadas al expandir la búsqueda a directorios con enlaces simbólicos, por lo que no es el enfoque óptimo. Lo que nadie ha mencionado todavía es que

find /path/to/search -xtype l

es el comando más conciso y lógicamente idéntico a

find /path/to/search -type l -xtype l

Ninguna de las soluciones presentadas hasta ahora detectará enlaces simbólicos cíclicos, que es otro tipo de rotura. esta preguntaaborda la portabilidad. En resumen, la forma portátil de encontrar enlaces simbólicos rotos, incluidos los enlaces cíclicos, es:

find /path/to/search -type l -exec test ! -e {} \; -print

Para más detalles, veresta preguntaoynform.org. Por supuesto, la fuente definitiva de todo esto es ladocumentación de findutils.

Respuesta3

El symlinkscomando dehttp://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gzse puede utilizar para identificar enlaces simbólicos con una variedad de características. Por ejemplo:

$ rm a
$ ln -s a b
$ symlinks .
dangling: /tmp/b -> a

Respuesta4

Creo que agregar la -Lbandera a su comando le permitirá deshacerse de grep:

$ find -L . -type l

http://www.commandlinefu.com/commands/view/8260/find-broken-symlinks

del manual:

-L

Hacer que la información del archivo y el tipo de archivo (ver stat(2)) devueltos para cada enlace simbólico sean los del archivo al que hace referencia el enlace, no el enlace en sí. Si el archivo al que se hace referencia no existe, la información y el tipo del archivo serán para el enlace en sí.

información relacionada