Linux: Trouvez tous les liens symboliques d'un "original" fichier? (reverse 'readlink')
Considérer la ligne de commande suivante extrait de:
$ cd /tmp/
$ mkdir dirA
$ mkdir dirB
$ echo "the contents of the 'original' file" > orig.file
$ ls -la orig.file
-rw-r--r-- 1 $USER $USER 36 2010-12-26 00:57 orig.file
# create symlinks in dirA and dirB that point to /tmp/orig.file:
$ ln -s $(pwd)/orig.file $(pwd)/dirA/
$ ln -s $(pwd)/orig.file $(pwd)/dirB/lorig.file
$ ls -la dirA/ dirB/
dirA/:
total 44
drwxr-xr-x 2 $USER $USER 4096 2010-12-26 00:57 .
drwxrwxrwt 20 root root 36864 2010-12-26 00:57 ..
lrwxrwxrwx 1 $USER $USER 14 2010-12-26 00:57 orig.file -> /tmp/orig.file
dirB/:
total 44
drwxr-xr-x 2 $USER $USER 4096 2010-12-26 00:58 .
drwxrwxrwt 20 root root 36864 2010-12-26 00:57 ..
lrwxrwxrwx 1 $USER $USER 14 2010-12-26 00:58 lorig.file -> /tmp/orig.file
À ce point, je peux utiliser readlink
pour voir qu'est-ce que l '"original" (eh bien, je suppose que l'habitude terme ici est soit "cible" ou "source", mais ceux dans mon esprit, peuvent être à l'opposé des concepts, donc je vais juste l'appeler "original") fichier des liens symboliques, c'est à dire
$ readlink -f dirA/orig.file
/tmp/orig.file
$ readlink -f dirB/lorig.file
/tmp/orig.file
... Cependant, ce que je voudrais savoir est - il une commande que je puisse courir sur le fichier, et de trouver tous les liens symboliques qui pointent vers elle? En d'autres termes, quelque chose comme (pseudo):
$ getsymlinks /tmp/orig.file
/tmp/dirA/orig.file
/tmp/dirB/lorig.file
Merci d'avance pour vos commentaires,
Cheers!
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas vu une commande pour cela et ce n'est pas une tâche facile, puisque la cible fichier ne contient aucune information sur ce que la source de fichiers point à elle.
Ceci est similaire à "dur" des liens, mais au moins ceux qui sont toujours sur le même système de fichiers, de sorte que vous pouvez faire un
find -inode
à la liste. Doux liens sont de plus en plus problématique, car ils peuvent traverser des systèmes de fichiers.Je pense que vous allez avoir à faire est fondamentalement effectuer une
ls -al
sur chaque fichier dans votre ensemble de la hiérarchie et de l'utilisationgrep
à la recherche pour-> /path/to/target/file
.Par exemple, en voici un que j'ai couru sur mon système (formaté pour des raisons de lisibilité - les deux dernières lignes sont en fait sur un ligne dans la sortie réelle):
find -inode
'. Cheers!ls
pour chaque fichier archivé, le sens qu'il vont être assez lente.find
avecxargs
est mieux pour l'efficacité, mais ce n'est pas pertinente à la question spécifique ici. Si cela s'avère être trop lent, puis par tous les moyens de lui demander comment le rendre plus rapide. Mais, si c'est un one-off genre de chose, ce n'est probablement pas nécessaire.find / -type l -ls
? Qui ignore la non-liens symboliques, et évite toutes les par fichier de processus de création (ce qui le rend plus rapide que ma réponse). P. s. la raison pour laquelle je suis tellement inquiet à propos de la vitesse, c'est que mon volume de démarrage a 824,220 fichiers sur elle, et si vous créez un processus pour chacun de ceux-là... ça va être un certain temps.ls
faire un changement d'habitude de leur sortie selon qu'ils les envoient à un terminal ou non. Et aussi parce que la plupart des gens l'utiliser pour faire quelque chose avec les noms de fichiers sans gestion des espaces. Mais cette solution n'est pas soumis à ces deux questions et, à condition de comprendre le format des données quels
produit, il n'est plus "mal" que n'importe quelle autre commande 🙂De l'utilisation de GNU
find
, ce sera de trouver les fichiers qui sont liés ou ayant un lien symbolique vers un fichier:ls -al
sur chaque fichier..."?? Cette commande n'fondamentalement la même (mais peut-être de façon plus optimisée) - ou quelque chose de fondamentalement différent? Merci encore, merci!find /dir/to/start -follow -inum $(stat -c %i /tmp/orig.file)
. Vous pourriez être en mesure de venir avec quelque chose à trouver des liens symboliques, mais rien ne se produit rapidement pour moi.Liens symboliques ne pas suivre ce qu'il pointe vers une destination donnée, de sorte que vous ne peut mieux faire que de vérifier chaque lien symbolique pour voir si elle pointe vers la destination de votre choix, tels que
Voici ce que j'ai trouvé. Je fais cela sur mac OS X, qui n'a pas
readlink -f
, j'ai donc dû utiliser une fonction d'assistance à la remplacer. Si vous avez une bonnereadlink -f
vous pouvez l'utiliser à la place. Aussi, l'utilisation dewhile ... done < <(find ...)
n'est pas strictement nécessaire dans ce cas, un simplefind ... | while ... done
serait de travailler; mais si vous avez toujours voulu faire quelque chose comme définir une variable à l'intérieur de la boucle (comme un critère de correspondance de fichiers), la version du canal serait pas parce que lewhile
boucle s'exécute dans un shell interne est exécuté. Enfin, notez que j'utilisefind ... -type l
de sorte que la boucle s'exécute uniquement sur des liens symboliques, pas d'autres types de fichiers.Inspiré par Gordon Davisson commentaire. Ceci est similaire à une autre réponse, mais j'ai eu les résultats escomptés en utilisant exec. J'ai besoin de quelque chose qui pourrait trouver des liens symboliques, sans savoir où se trouve le fichier source.
C'est peut-être trop simpliste pour ce que vous voulez faire, mais que je trouve très utile.
il n'a Pas de réponse à votre question, littéralement, comme il n'est pas 'exécuter sur le fichier d'origine", mais il accomplit la tâche. Mais, beaucoup plus de l'accès au disque dur. Et, il ne fonctionne que pour les "doux" les fichiers liés qui est la majorité de l'utilisateur des fichiers liés.
à partir de la racine de vos données répertoire de stockage ou les utilisateurs des répertoires de données, où que
symlinked
"fichiers" à laorig.file
peuvent résider, exécutez la commande find:ou
Je voudrais l'utiliser Normalement partie du nom par exemple,
'*orig*'
pour commencer, parce que nous savons que les utilisateurs renommer (préfixe) un fichier nommé avec un plus descriptif, les uns comme " Jan rapport de la London _ orig.fichier.2015.01.21 " ou quelque chose.Note: je n'ai Jamais eu l'-samefile option pour travailler pour moi.
propre, simple, facile à retenir
espère que cela aide Quelqu'un.
Landis.