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

Resuelto hafichuk asked hace 12 años • 8 respuestas

Estoy intentando encontrar todos los enlaces simbólicos dentro de un árbol de directorios para mi sitio web. Sé que puedo utilizarlo findpara hacer esto, pero no sé cómo comprobar los directorios de forma recursiva.

Probé este comando:

find /var/www/ -type l

... y luego descubrí que el contenido /var/wwwson enlaces simbólicos, así que cambié el comando a:

find -L /var/www/ -type l

Tarda un poco en ejecutarse, sin embargo, no obtengo coincidencias.

¿Cómo consigo que esto verifique los subdirectorios?

hafichuk avatar Dec 15 '11 06:12 hafichuk
Aceptado

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

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

Si tu intención es seguir los enlaces simbólicos también, debes usar tu findcomando pero debes incluir la -Lopción; de hecho la findpágina de 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 prueba esto:

find -L /var/www/ -type l

Esto probablemente funcionará: encontré en la findpágina de manual este diamante: si estás usando la -typeopción, debes 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.

Entonces:

find -L /var/www/ -xtype l
ztank1013 avatar Dec 14 '2011 23:12 ztank1013

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. Simple y llanamente...

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

Encuentre 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 indica findseguir enlaces simbólicos, a menos que estén rotos.

Buscar y reemplazar enlaces simbólicos rotos

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

Más ejemplos de búsqueda

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

Serge Stroobandt avatar Jan 29 '2014 17:01 Serge Stroobandt

Para ver solo los enlaces simbólicos, puedes 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 avatar Apr 08 '2016 08:04 MariusPontmercy