Ich würde vorschlagen , stark nicht zu verwenden find -L
für die Aufgabe (Erläuterung siehe unten). Hier sind einige andere Möglichkeiten, dies zu tun:
Wenn Sie eine "reine find
" Methode verwenden möchten , sollte sie eher so aussehen:
find . -xtype l
( xtype
Ist ein Test auf einem dereferenzierte Link ausgeführt) Dies kann nicht in allen Versionen von zur Verfügung steht find
allerdings. Es gibt aber auch andere Möglichkeiten:
Sie können auch test -e
aus dem find
Befehl ausführen :
find . -type l ! -exec test -e {} \; -print
Sogar ein grep
Trick könnte besser (dh sicherer ) sein als find -L
, aber nicht genau wie in der Frage dargestellt (der ganze Ausgabezeilen, einschließlich Dateinamen, greift):
find . -type l -exec sh -c 'file -b "$1" | grep -q ^broken' sh {} \; -print
Der find -L
Trick zitiert von Solo von commandlinefu sieht nett aus und hacky, aber es hat eine sehr gefährliche pitfall : Alle symbolischen Links gefolgt sind. Betrachten Sie das Verzeichnis mit den folgenden Inhalten:
$ ls -l
total 0
lrwxrwxrwx 1 michal users 6 May 15 08:12 link_1 -> nonexistent1
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_2 -> nonexistent2
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_3 -> nonexistent3
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_4 -> nonexistent4
lrwxrwxrwx 1 michal users 11 May 15 08:20 link_out -> /usr/share/
Wenn Sie find -L . -type l
in diesem Verzeichnis laufen , werden auch alle /usr/share/
durchsucht (und das kann sehr lange dauern) 1 . Verwenden Sie für einen find
Befehl, der "immun gegen ausgehende Links" ist, nicht-L
.
1 Dies mag wie eine kleine Unannehmlichkeit aussehen (der Befehl wird "nur" lange brauchen, um alle zu durchlaufen /usr/share
) - kann jedoch schwerwiegendere Konsequenzen haben. Betrachten Sie beispielsweise Chroot-Umgebungen: Sie können in einem Unterverzeichnis des Hauptdateisystems vorhanden sein und Symlinks zu absoluten Positionen enthalten. Diese Verknüpfungen scheinen für das "äußere" System defekt zu sein, da sie nur dann auf richtige Stellen verweisen, wenn Sie die Chroot betreten haben. Ich erinnere mich auch, dass einige Bootloader Symlinks verwendeten /boot
, die nur in einer anfänglichen Bootphase Sinn machten, als die Bootpartition als gemountet wurde /
.
Wenn Sie also einen find -L
Befehl verwenden, um defekte Symlinks in einem harmlos aussehenden Verzeichnis zu suchen und dann zu löschen, können Sie sogar Ihr System beschädigen ...
-type l
das für überflüssig-xtype l
, da-type l
bei Nicht-Links so verfahren wird. Alsofind -xtype l
ist wahrscheinlich alles was Sie brauchen. Danke für diesen Ansatz./proc/XXX/exe
Verbindung unterbrochen ist. Verwenden Sie dazutest -e "$(readlink /proc/XXX/exe)"
.find . -xtype l
bedeutet "Finde alle Symlinks, deren (ultimative) Zieldateien Symlinks sind". Das endgültige Ziel eines Symlinks kann jedoch kein Symlink sein. Andernfalls können wir dem Link weiterhin folgen und es ist nicht das endgültige Ziel. Da es keine solchen Symlinks gibt, können wir sie als etwas anderes definieren, dh als defekte Symlinks.l
, ist für mich weniger verwirrend.-L
Hack gilt, sondern für das (blinde) Entfernen defekter Symlinks im Allgemeinen.Der
symlinks
Befehl von http://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gz kann verwendet werden, um Symlinks mit einer Vielzahl von Merkmalen zu identifizieren. Zum Beispiel:quelle
symlinks
ist auf Fedora vorinstalliert.Wie rozcietrzewiacz bereits kommentiert hat,
find -L
kann die Ausweitung der Suche auf verknüpfte Verzeichnisse unerwartete Folgen haben, ist also nicht der optimale Ansatz. Was noch niemand erwähnt hat, ist dasist der prägnantere und logisch identische Befehl zu
Keine der bisher vorgestellten Lösungen erkennt zyklische Symlinks, was eine andere Art von Bruch darstellt. Diese Frage befasst sich mit der Portabilität. Zusammenfassend lässt sich sagen, dass die Suche nach defekten symbolischen Links, einschließlich zyklischer Links, portabel ist:
Weitere Einzelheiten finden Sie in dieser Frage oder auf ynform.org . Die endgültige Quelle für all dies ist natürlich die Dokumentation der Fundstücke .
quelle
find -L
Fallstricke und zyklische Links an. +1-xtype
es in POSIX nicht spezifiziert ist und wenn man esfind(1)
in macOS anschaut hat es das-type
aber nicht-xtype
.Ich glaube, das Hinzufügen der
-L
Flagge zu Ihrem Befehl ermöglicht es Ihnen, das grep loszuwerden:http://www.commandlinefu.com/commands/view/8260/find-broken-symlinks
vom mann:
quelle
Wenn Sie ein anderes Verhalten benötigen, unabhängig davon, ob die Verknüpfung unterbrochen oder zyklisch ist, können Sie auch% Y mit find verwenden:
Dieses Beispiel wurde aus diesem Beitrag kopiert (Site gelöscht) .
Referenz
quelle
find
Befehl unterstützt nichtxtype
daraus abgeleitet werden kann:find . type l -printf "%Y %p\n" | grep -w '^N'
. Da Andy mich mit der gleichen (grundlegenden) Idee in seinem Drehbuch verprügelte, wollte ich es nicht als separate Antwort schreiben. :)Ich benutze dies für meinen Fall und es funktioniert ziemlich gut, da ich das Verzeichnis kenne, um nach defekten Symlinks zu suchen:
und mein Ordner enthält einen Link zu
/usr/share
, überquert ihn jedoch nicht. Geräteübergreifende Links und solche, die für Chroots usw. gültig sind, sind immer noch eine Falle, aber für meinen Anwendungsfall ist es ausreichend.quelle
Einfache, einfache Antwort, eine Variation der OP-Version. Manchmal möchten Sie einfach nur etwas einfach zu tippen oder sich zu erinnern:
quelle
find -L . -type l |xargs symlinks
gibt Ihnen Informationen darüber, ob der Link vorhanden ist oder nicht, und zwar auf der Basis der gefundenen Dateien.quelle
Dadurch werden die Namen defekter Symlinks im aktuellen Verzeichnis ausgedruckt.
Arbeitet in Bash. Ich weiß nichts über andere Muscheln.
quelle