¿Cómo encuentro todos los enlaces simbólicos en un árbol de directorios?

255

Estoy tratando de encontrar todos los enlaces simbólicos dentro de un árbol de directorios para mi sitio web. Sé que puedo usar findpara hacer esto, pero no puedo encontrar la manera de verificar los directorios de forma recursiva.

He intentado este comando:

find /var/www/ -type l

... y luego descubrí que los contenidos en /var/wwwson enlaces simbólicos, así que he cambiado el comando a:

find -L /var/www/ -type l

me lleva un tiempo correr, sin embargo, no tengo partidos.

¿Cómo consigo esto para verificar subdirectorios?

Hafichuk
fuente

Respuestas:

301

Esto recorrerá el /path/to/folderdirectorio de forma recursiva y enumerará solo los enlaces simbólicos:

ls -lR /path/to/folder | grep ^l

Si su intención es seguir también los enlaces simbólicos, debe usar su findcomando pero debe incluir la -Lopción; de hecho, la findpágina del manual dice:

   -L     Follow symbolic links.  When find examines or prints information
          about files, the information used shall be taken from the  prop‐
          erties  of  the file to which the link points, not from the link
          itself (unless it is a broken symbolic link or find is unable to
          examine  the file to which the link points).  Use of this option
          implies -noleaf.  If you later use the -P option,  -noleaf  will
          still  be  in  effect.   If -L is in effect and find discovers a
          symbolic link to a subdirectory during its search, the subdirec‐
          tory pointed to by the symbolic link will be searched.

          When the -L option is in effect, the -type predicate will always
          match against the type of the file that a symbolic  link  points
          to rather than the link itself (unless the symbolic link is bro‐
          ken).  Using -L causes the -lname and -ilname predicates  always
          to return false.

Entonces intente esto:

find -L /var/www/ -type l

Esto probablemente funcionará: encontré en la findpágina del manual este diamante: si está utilizando la -typeopción, debe cambiarla a la -xtypeopción:

          l      symbolic link; this is never true if the -L option or the
                 -follow option is in effect, unless the symbolic link  is
                 broken.  If you want to search for symbolic links when -L
                 is in effect, use -xtype.

Luego:

find -L /var/www/ -xtype l
ztank1013
fuente
1
Gracias, esto probablemente funcionaría, sin embargo, acabo de notar que el contenido de / var / www / ya son enlaces simbólicos y esto no parece repetirse en esos directorios.
hafichuk
44
@hafichuk ver edición final en mi respuesta ( find -L /var/www/ -xtype l). Usar en -xtypelugar de -typedebería hacer el truco en tu búsqueda. ¡Buena suerte!
ztank1013
3
Hacer que ls -laR /path/to/folder | grep ^lsi usted también quiere proceso "oculta" punto carpetas ...
wimvds
2
¡Gracias! Pero esto solo muestra el nombre de los enlaces, pero no su ubicación.
Kostanos
8
en Mac OSX (10.9), -xtypeno está disponible. find . -type lparece estar comprobando recursivamente.
amertkara
227

Un comando, sin tuberías

find . -type l -ls

Explicación: find desde el directorio actual en .adelante, todas las referencias de -type ltinta y enumerarlas -lsen detalle. Llano y simple ...

Ampliando esta respuesta, aquí hay un par más de findcomandos relacionados con enlaces simbólicos :

Encuentra enlaces simbólicos a un objetivo específico

find . -lname link_target

Tenga en cuenta que link_targetes un patrón que puede contener caracteres comodín.

Encuentra enlaces simbólicos rotos

find -L . -type l -ls

La -Lopción le indica findque siga enlaces simbólicos, a menos que esté roto.

Encuentra y reemplaza enlaces simbólicos rotos

find -L . -type l -delete -exec ln -s new_target {} \;

Más ejemplos de búsqueda

Se findpueden encontrar más ejemplos aquí: https://hamwaves.com/find/

Serge Stroobandt
fuente
77
Si buscas ser más sucinto, vale la pena mencionar que la mayoría de las versiones findtienen una -lsopción. Entonces find . -type l -lsdebería ser el equivalente de lo anterior.
Bratchley
77
Esto mejora la respuesta aceptada porque también le dice dónde están los enlaces simbólicos en el árbol de directorios, especialmente importante cuando se trabaja con el tipo de árbol complejo y profundo que probablemente tenga enlaces simbólicos.
Jesse Crossen el
2
Mejor que la pregunta aceptada como una mejor respuesta.
Lord_Dracon
3
Esta respuesta es mucho más útil que la aceptada. Además, si usted quiere encontrar enlaces simbólicos que apuntan a archivos en algún directorio: find -lname '*/dir/*' -printf '%P -> %l\n'. Vale la pena mencionar que link_target es un patrón.
x-yuri
1
Este es mi tipo de respuesta. Llano y simple. Gracias.
truthadjustr
11

find Ya se ve de forma recursiva por defecto:

[15:21:53 ~]$ mkdir foo
[15:22:28 ~]$ cd foo
[15:22:31 ~/foo]$ mkdir bar
[15:22:35 ~/foo]$ cd bar
[15:22:36 ~/foo/bar]$ ln -s ../foo abc
[15:22:40 ~/foo/bar]$ cd ..
[15:22:47 ~/foo]$ ln -s foo abc
[15:22:52 ~/foo]$ find ./ -type l
.//abc
.//bar/abc
[15:22:57 ~/foo]$ 
jman
fuente
Este es probablemente uno de esos problemas, todos los archivos en / var / www son enlaces simbólicos. ¿Los findrepetimos por defecto? Supongo que no;)
hafichuk
Sí, probablemente para evitar bucles.
jman
He actualizado para usar la -Lbandera para encontrar sin suerte, ¿alguna conjetura?
hafichuk
Solución perfecta, y muestra la ubicación de los enlaces. ¡Gracias!
Kostanos
8

Para ver solo los enlaces simbólicos, puede usar

find -L /path/to/dir/ -xtype l 

mientras que si desea ver también a qué archivos se dirigen, simplemente agregue un ls

find -L /path/to/dir/ -xtype l -exec ls -al {} \;
MariusPontmercy
fuente
6

Esto es lo mejor que he encontrado hasta ahora: le muestra los enlaces simbólicos en el directorio actual, recursivamente, pero sin seguirlos, que se muestran con rutas completas y otra información:

find ./ -type l -print0 | xargs -0 ls -plah

Las salidas se ven así:

lrwxrwxrwx 1 apache develop 99 Dec  5 12:49 ./dir/dir2/symlink1 -> /dir3/symlinkTarget
lrwxrwxrwx 1 apache develop 81 Jan 10 14:02 ./dir1/dir2/dir4/symlink2 -> /dir5/whatever/symlink2Target
etc...
siliconrockstar
fuente
0

Lo que hago es crear un script en mi directorio bin que es como un alias. Por ejemplo, tengo un script llamado lsd ls -l | grep ^ d

podrías hacer uno lsl ls -lR | grep ^ l

Simplemente modifícalos + x y listo.

Alex M
fuente