Encuentra todos los enlaces absolutos en un árbol de directorios

8

¿Cómo detecto (recursivamente) todos los enlaces simbólicos en un directorio que identifican su objetivo de manera absoluta en lugar de relativa?

Dado que es muy probable que estos enlaces se rompan cuando se mueve un árbol de directorios completo, me gustaría tener una forma de identificarlos.

Incluso los enlaces relativos pueden romperse si se mueve el árbol de directorios (si resultan apuntar fuera de la raíz del árbol de directorios), pero creo que esto se aborda en esta pregunta .

Marcus Junius Brutus
fuente

Respuestas:

15

Para encontrar enlaces absolutos, puede usar findla -lnameopción 'si es findcompatible con eso (está disponible al menos en GNU find, en FreeBSD y macOS):

find . -type l -lname '/*'

Esto le pide findimprimir los nombres de los archivos que son enlaces simbólicos y cuyo contenido (objetivo) coincide /*con el globing de shell.

Estrictamente hablando, POSIX especifica que los nombres de ruta absolutos comienzan con uno /o tres o más/ ; para que coincida con eso, puedes usar

find . -lname '/*' ! -lname '//*' -o -lname '///*'

¿En qué sistemas es // foo / bar diferente de / foo / bar? tiene más detalles al respecto.

(Gracias a Sato Katsura por señalar que -lnamees específico de GNU, a fd0 por mencionar que en realidad también está disponible en al menos FreeBSD y macOS, y a Stéphane Chazelas por mostrar la definición absoluta del nombre de ruta POSIX).

Stephen Kitt
fuente
Estaba a punto de publicar: lo find ./ -t l -exec ls -l {} \;que debería ser una alternativa segura. Sería fácil analizar su salida haciendo lo que sea necesario.
Centimane
@Centimane ver ¿Por qué no analizar ls? ...
Stephen Kitt
7

Puede encontrar symlinksútil la utilidad:

$ symlinks -r .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas

Y puede arreglar los enlaces por usted. Aquí con -tpara decir lo que haría :

$ symlinks -rct .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas
changed:  /home/chazelas/test/chazelas -> ../../chazelas
Stéphane Chazelas
fuente