lien symbolique: recherchez tous les fichiers qui renvoient à ce fichier


Réponses:


132

Cela dépend, si vous essayez de trouver des liens vers un fichier spécifique qui est appelé, foo.txt,c'est le seul bon moyen:

find -L / -samefile path/to/foo.txt

D'un autre côté, si vous essayez simplement de trouver des liens vers n'importe quel fichier qui se trouve être nommé foo.txt, alors quelque chose comme

find / -lname foo.txt

ou

find . -lname \*foo.txt # ignore leading pathname components

problème résolu magnifiquement. Merci à toutes les personnes qui ont répondu.
lukmac

8
Comme j'ai commenté une réponse supprimée, vous pouvez utiliser -xtype lpour n'avoir que les liens symboliques de la liste
Hasturkun

vous voudrez peut-être récurer, car tous les fichiers pointant vers foo.txt peuvent eux-mêmes être pointés par d'autres liens ... ex: A-> B-> foo.txt, / tmp / C-> B-> foo.txt, etc.
Olivier Dulac

cela peut fonctionner aussi si votre composant de nom est un répertoire parent nommé dans le lien, en recherchant find . -lname '*foo.dir*'(correspond par exemple file.txt -> ../foo.dir/file.txt)
Yonatan

22

Trouvez le numéro d'inode du fichier, puis recherchez tous les fichiers avec le même numéro d'inode:

$ ls -i foo.txt
41525360 foo.txt

$ find . -follow -inum 41525360

Sinon, essayez l' lnameoption de find, mais cela ne fonctionnera pas si vous avez des liens symboliques relatifs, par exemplea -> ../foo.txt

$ find . -lname /path/to/foo.txt

3
Si vous utilisez une version récente de GNU find, vous pouvez également utiliser l' -samefileoption avec -Lpour le même effet, sans avoir à rechercher l'inode vous
Hasturkun

5
Mais cela trouvera également des fichiers sur d'autres systèmes de fichiers qui ont le même numéro d'inode.
DigitalRoss

Si fooest un répertoire, utilisez ln -di, sur une seule ligne:find . -follow -inum $(ls -di foo.txt |cut -d" " -f1)
rubo77

1
Cette réponse est fausse. Un lien symbolique n'a pas le même inode que sa cible. Cela ne fonctionnera que pour un fichier dans un dossier lié par un lien symbolique. Mais ce n'est pas ce qui a été demandé.
Jules Lamur

4

Je préfère utiliser l' symlinksutilitaire, qui est également pratique lors de la recherche de liens symboliques rompus. Installer par:

sudo apt install symlinks

Afficher tous les liens symboliques dans le dossier et les sous-dossiers actuels:

symlinks -rv .
  • -r: récursif
  • -v: verbeux (afficher tous les liens symboliques, pas seulement les liens rompus)

Pour trouver un lien symbolique spécifique, il suffit de grep:

symlinks -rv . | grep foo.txt
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.