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./proc/XXX/exeenlace está roto. Para esto, usetest -e "$(readlink /proc/XXX/exe)".find . -xtype lsignifica "encontrar todos los enlaces simbólicos cuyos archivos de destino (últimos) son enlaces simbólicos". Pero el objetivo final de un enlace simbólico no puede ser un enlace simbólico, de lo contrario todavía podemos seguir el enlace y no es el objetivo final. Como no existen dichos enlaces simbólicos, podemos definirlos como algo más, es decir, enlaces simbólicos rotos.l, es menos confuso para mí.-Lpirateo, sino más bien a (ciegamente) eliminar enlaces simbólicos rotos en general.El
symlinkscomando de http://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gz puede usarse para identificar enlaces simbólicos con una variedad de características. Por ejemplo:fuente
symlinksestá preinstalado en Fedora.Como rozcietrzewiacz ya ha comentado,
find -Lpuede tener una consecuencia inesperada de expandir la búsqueda en directorios con enlaces simbólicos, por lo que no es el enfoque óptimo. Lo que nadie ha mencionado todavía es quees el comando más conciso y lógicamente idéntico para
Ninguna de las soluciones presentadas hasta ahora detectará enlaces simbólicos cíclicos, que es otro tipo de rotura. Esta pregunta aborda la portabilidad. Para resumir, la forma portátil de encontrar enlaces simbólicos rotos, incluidos los enlaces cíclicos, es:
Para más detalles, vea esta pregunta o ynform.org . Por supuesto, la fuente definitiva de todo esto es la documentación de findutils .
fuente
find -Lasí como los enlaces cíclicos. +1-xtypeno se ha especificado en POSIX y de hecho si nos fijamos enfind(1)MacOS tiene-type, pero no-xtype.Creo que agregar la
-Lbandera a su comando le permitirá deshacerse del grep:http://www.commandlinefu.com/commands/view/8260/find-broken-symlinks
del hombre:
fuente
Si necesita un comportamiento diferente si el enlace está roto o cíclico, también puede usar% Y con find:
Este ejemplo se copia de esta publicación (sitio eliminado) .
Referencia
fuente
findcomando no admitextypese pueden derivar de esto:find . type l -printf "%Y %p\n" | grep -w '^N'. Como Andy me ganó con la misma idea (básica) en su guión, me resistí a escribirlo como respuesta por separado. :)Lo uso para mi caso y funciona bastante bien, ya que conozco el directorio para buscar enlaces simbólicos rotos:
y mi carpeta incluye un enlace
/usr/sharepero no lo atraviesa. Los enlaces entre dispositivos y aquellos que son válidos para chroots, etc., siguen siendo un obstáculo, pero para mi caso de uso es suficiente.fuente
Respuesta simple y obvia, que es una variación de la versión de OP. A veces, solo quieres algo fácil de escribir o recordar:
fuente
find -L . -type l |xargs symlinksle proporcionará información sobre si el enlace existe o no en cada archivo encontrado.fuente
Esto imprimirá los nombres de enlaces simbólicos rotos en el directorio actual.
Trabaja en Bash. No sé sobre otras conchas.
fuente