Cómo encontrar todos los enlaces simbólicos que apuntan a cualquier archivo / directorio dentro de un directorio dado

15

En esta pregunta o en esta (por ejemplo) obtendrá soluciones sobre cómo buscar enlaces simbólicos que apunten a un directorio dado (llamémoslo /dir1), mientras que estoy interesado en enlaces simbólicos que posiblemente apunten a cualquier archivo / carpeta dentro /dir1.

Quiero eliminar dicho directorio, pero no estoy seguro de que sea seguro hacerlo, ya que en otro directorio (llamémoslo /dir2), es posible que tenga enlaces simbólicos que apuntan a partes internas de /dir1.

Además, puedo haber creado estos enlaces simbólicos utilizando rutas absolutas o relativas. Mi única ayuda es que sé que los enlaces simbólicos que quiero verificar están en un sistema de archivos montado, en /dir2.

Antonello
fuente

Respuestas:

15

Puede encontrar todos los enlaces simbólicos usando:

find / -type l 

es posible que desee ejecutar esto como root para llegar a todos los lugares del disco.

Puede expandirlos utilizando readlink -fpara obtener la ruta completa del enlace y debería poder obtener grepel resultado en el directorio de destino que está considerando eliminar:

find / -type l -exec readlink -f {} + | grep -F /dir2

El uso find / -type l -printf '%l\n'no funciona ya que obtiene enlaces relativos como los ../tmp/xyzque podrían estar apuntando a su directorio de destino, pero no coinciden porque no están completamente expandidos.

Anthon
fuente
1
En caso de subárbol puede ser útil seguir enlaces simbólicos:find -L /subtree -xtype l -exec readlink -f {} +
ruvim
3

En mi caso, la respuesta aceptada no fue útil (porque no generó la fuente del enlace). Esto es lo que funcionó para mí.

Trabajé alrededor usando dos -execcláusulas:

find /home/ -type l -exec readlink -nf {} ';' -exec echo " -> {}" ';' | grep "/dir2"
Dorian Marchal
fuente
1

Con zsh:

printf '%s\n' /dir2/**/*(D@e'([[ $REPLY:P = /dir1(/*|) ]])')
Stéphane Chazelas
fuente