Comment trouver tous les liens symboliques pointant vers n'importe quel fichier / répertoire dans un répertoire donné

15

Sur cette question ou sur celle-ci (par exemple), vous obtiendrez des solutions sur la façon de rechercher des liens symboliques pointant vers un répertoire donné (appelons-le /dir1), tandis que je suis intéressé par des liens symboliques pointant éventuellement vers n'importe quel fichier / dossier à l'intérieur /dir1.

Je veux supprimer un tel répertoire mais je ne suis pas sûr de pouvoir le faire, car sur un autre répertoire (appelons-le /dir2), je peux avoir des liens symboliques pointant vers les parties internes de /dir1.

De plus, j'ai peut-être créé ces liens symboliques en utilisant des chemins absolus ou relatifs. Ma seule aide est que je sais que les liens symboliques que je veux vérifier se trouvent sur un système de fichiers monté /dir2.

Antonello
la source

Réponses:

15

Vous pouvez retrouver tous les liens symboliques en utilisant:

find / -type l 

vous voudrez peut-être l'exécuter en tant que root afin d'accéder à chaque emplacement du disque.

Vous pouvez les développer en utilisant readlink -fpour obtenir le chemin d'accès complet du lien et vous devriez être en mesure de grepgénérer la sortie par rapport au répertoire cible que vous envisagez de supprimer:

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

L'utilisation find / -type l -printf '%l\n'ne fonctionne pas car vous obtenez des liens relatifs comme ceux ../tmp/xyzqui pourraient pointer vers votre répertoire cible, mais ils ne correspondent pas car ils ne sont pas entièrement développés.

Anthon
la source
1
En cas de sous-arbre, il peut être utile de suivre les liens symboliques:find -L /subtree -xtype l -exec readlink -f {} +
ruvim
3

Dans mon cas, la réponse acceptée n'a pas été utile (car elle n'a pas généré la source du lien). Voici ce qui a fonctionné pour moi.

J'ai travaillé autour de lui en utilisant deux -execclauses:

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

Avec zsh:

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