Finden Sie alle absoluten Links in einem Verzeichnisbaum

8

Wie erkenne ich (rekursiv) alle Symlinks in einem Verzeichnis, die ihr Ziel absolut und nicht relativ identifizieren?

Da diese Links sehr wahrscheinlich brechen, wenn ein ganzer Verzeichnisbaum verschoben wird, möchte ich sie identifizieren können.

Sogar relative Links können unterbrochen werden, wenn der Verzeichnisbaum verschoben wird (wenn sie zufällig außerhalb des Stammverzeichnisses des Verzeichnisbaums verweisen), aber ich denke, dies wird in dieser Frage behandelt .

Marcus Junius Brutus
quelle

Antworten:

15

Um absolute Links zu finden, können Sie find‚s -lnameOption , wenn der findTräger , dass (es zumindest in GNU verfügbar ist find, auf FreeBSD und Mac OS):

find . -type l -lname '/*'

Hiermit werden Sie findaufgefordert, die Namen von Dateien zu drucken, bei denen es sich um symbolische Links handelt und deren Inhalt (Ziel) /*mithilfe von Shell-Globbing übereinstimmt .

Genau genommen gibt POSIX an, dass absolute Pfadnamen mit einem /oder drei oder mehr beginnen/ . Um dies zu erreichen, können Sie verwenden

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

Auf welchen Systemen unterscheidet sich // foo / bar von / foo / bar? hat mehr Details dazu.

(Vielen Dank an Sato Katsura für den Hinweis, dass -lnamees GNU-spezifisch ist, an fd0 für die Erwähnung, dass es tatsächlich auch auf mindestens FreeBSD und macOS verfügbar ist, und an Stéphane Chazelas für das Aufrufen der Definition des absoluten POSIX-Pfadnamens.)

Stephen Kitt
quelle
Ich wollte gerade posten: Das find ./ -t l -exec ls -l {} \;sollte eine sichere Alternative sein. Es wäre einfach, die Ausgabe zu analysieren und alles zu tun, was benötigt wird.
Centimane
@ Centimane sehen Warum nicht analysieren ls? ...
Stephen Kitt
7

Das symlinksDienstprogramm ist möglicherweise hilfreich:

$ 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

Und kann die Links für Sie reparieren. Hier mit -tzu sagen, was es tun würde :

$ 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
quelle