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./proc/XXX/exe
enlace está roto. Para esto, usetest -e "$(readlink /proc/XXX/exe)"
.find . -xtype l
significa "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í.-L
pirateo, sino más bien a (ciegamente) eliminar enlaces simbólicos rotos en general.El
symlinks
comando 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
symlinks
está preinstalado en Fedora.Como rozcietrzewiacz ya ha comentado,
find -L
puede 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 -L
así como los enlaces cíclicos. +1-xtype
no se ha especificado en POSIX y de hecho si nos fijamos enfind(1)
MacOS tiene-type
, pero no-xtype
.Creo que agregar la
-L
bandera 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
find
comando no admitextype
se 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/share
pero 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 symlinks
le 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