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 .
Antworten:
Um absolute Links zu finden, können Sie
find
‚s-lname
Option , wenn derfind
Träger , dass (es zumindest in GNU verfügbar istfind
, auf FreeBSD und Mac OS):Hiermit werden Sie
find
aufgefordert, 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 verwendenAuf welchen Systemen unterscheidet sich // foo / bar von / foo / bar? hat mehr Details dazu.
(Vielen Dank an Sato Katsura für den Hinweis, dass
-lname
es 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.)quelle
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.ls
? ...Das
symlinks
Dienstprogramm ist möglicherweise hilfreich:Und kann die Links für Sie reparieren. Hier mit
-t
zu sagen, was es tun würde :quelle