Trouver tous les liens absolus dans une arborescence de répertoires

8

Comment détecter (récursivement) tous les liens symboliques dans un répertoire qui identifient leur cible de manière absolue plutôt que relative?

Étant donné que ces liens sont très susceptibles de se rompre lorsqu'une arborescence de répertoires entière est déplacée, j'aimerais avoir un moyen de les identifier.

Même les liens relatifs peuvent se rompre si l'arborescence des répertoires est déplacée (s'ils se trouvent en dehors de la racine de l'arborescence des répertoires), mais je pense que cela est traité dans cette question .

Marcus Junius Brutus
la source

Réponses:

15

Pour trouver des liens absolus, vous pouvez utiliser findl' -lnameoption de si votre findsupporte cela (il est disponible au moins dans GNU find, sur FreeBSD et macOS):

find . -type l -lname '/*'

Cela demande findd'imprimer les noms des fichiers qui sont des liens symboliques et dont le contenu (cible) correspond à l' /*aide de la globalisation du shell.

À proprement parler, POSIX spécifie que les chemins absolus commencent par un /ou trois ou plus/ ; pour correspondre à cela, vous pouvez utiliser

find . -lname '/*' ! -lname '//*' -o -lname '///*'

Sur quels systèmes // foo / bar est-il différent de / foo / bar? a plus de détails à ce sujet.

(Merci à Sato Katsura d' avoir souligné qu'il -lnameest spécifique à GNU, à fd0 d' avoir mentionné qu'il est en fait également disponible sur au moins FreeBSD et macOS, et à Stéphane Chazelas d'avoir évoqué la définition de nom de chemin absolu POSIX.)

Stephen Kitt
la source
J'étais sur le point de poster: find ./ -t l -exec ls -l {} \;ce qui devrait être une alternative sûre. Il serait facile d'analyser sa sortie et de faire tout ce qui est nécessaire.
Centimane
@Centimane voir Pourquoi ne pas analyser ls? ...
Stephen Kitt
7

Vous pouvez trouver l' symlinksutilitaire utile:

$ symlinks -r .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas

Et peut réparer les liens pour vous. Ici avec -tpour dire ce que cela ferait :

$ symlinks -rct .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas
changed:  /home/chazelas/test/chazelas -> ../../chazelas
Stéphane Chazelas
la source