Je déplace fréquemment des arborescences de répertoires vers d'autres emplacements ou copie leurs archives tar sur d'autres machines, et j'aimerais avoir une méthode pour vérifier si des liens symboliques dans une arborescence de répertoires A pointent vers des emplacements en dehors de A car ils seront rompus dans le déplacé / copié annuaire.
8
Utilisez bindfs pour créer une autre vue de cette arborescence de répertoires.
Utilisez ensuite l' utilitaire symlinks (fourni par de nombreuses distributions ou compilez-le à partir de la source ) pour détecter les liens entre les systèmes de fichiers.
(Notez que l'analyse de la sortie suppose que vos liens symboliques et leurs cibles ne contiennent pas de sauts de ligne, pas plus que les chemins vers les liens symboliques ne contiennent la sous-chaîne
->
.) Ce même utilitaire peut également convertir des liens symboliques absolus en relatifs (mais vous voudriez le faire à partir de l'emplacement d'origine).la source
Avec zsh:
Maintenant, si le répertoire est
/foo
et que vous avez/foo/bar
un lien symbolique vers/foo/baz
, c'est un lien dont la cible est dans / foo, mais une fois déplacé, le lien sera toujours rompu, vous voudrez peut-être également faire correspondre les liens symboliques aux chemins absolus.Mais même dans ce cas, un
bar => ../foo/baz
in/foo
serait un problème (faux négatif), tout comme una => b
oùb
est un lien symbolique en dehors de l'arbre (faux positif, selon la façon dont vous voulez le voir)la source
J'ai dû modifier un peu la réponse donnée par @bahamat pour que cela fonctionne.
La version fournie a simplement signalé l'emplacement absolu incriminé, mais pas le lien symbolique qui y pointe.
Voici ce que j'ai utilisé (je suis sûr qu'il peut être amélioré):
la source
for f in $(find . -type l); do echo $(realpath -m -q $f) '<-' $f; done | grep-v "^$(pwd)"
(notamment-m
et-q
qui filtre les liens rompus et non externes)GNU coreutils prouve
realpath
, qui résout les liens symboliques. Avec cela, vous pouvez comparer la cible de chaque lien symbolique au répertoire de travail actuel avec quelque chose comme:la source
-type l
, aucune-r
option pourread
, IFS non filtréread
,$filename
non cité,$PWD
traité comme une expression régulière, les chemins avec des caractères de nouvelle ligne non pris en compte,/foobar
correspondraient à$PWD
== "/ foo"