Wie finde ich defekte Symlinks?

Wie finde ich defekte Symlinks?

Gibt es eine Möglichkeit, alle symbolischen Links zu finden, die nirgendwohin zeigen?

find ./ -type l

gibt mir alle symbolischen Links, macht aber keinen Unterschied zwischen Links, die irgendwohin führen und Links, die dort nicht hinführen.

Was ich derzeit mache:

find ./ -type l -exec file {} \; | grep broken

Aber ich frage mich, welche alternativen Lösungen es gibt.

Antwort1

Ich empfehle dringendnichtfür die Aufgabe verwenden find -L (Erklärung siehe unten). Hier sind einige weitere Möglichkeiten, dies zu tun:

  • Wenn Sie eine „reine“ Methode verwenden möchten findund von der GNU-Implementierung ausgehen find, sollte es eher so aussehen:

    find . -xtype l
    

    (xtypeist ein Test, der an einem dereferenzierten Link durchgeführt wird)

  • Portabel (wenn auch weniger effizient) können Sie die Ausführung auch test -einnerhalb des findBefehls durchführen:

    find . -type l ! -exec test -e {} \; -print
    
  • Sogar einige grepTricks könnten besser sein (z. B.sicherer) als find -L, aber nicht genau wie in der Frage dargestellt (die ganze Ausgabezeilen, einschließlich Dateinamen, durchsucht):

    find . -type l -exec sh -c 'file -b "$1" | grep -q "^broken"' sh {} \; -print
    

Der find -Lzitierte Trickvon soloausBefehlszeilenfusieht nett und hacky aus, aber es hat eine sehrgefährliche Falle: Alle symbolischen Links werden verfolgt. Betrachten Sie das Verzeichnis mit dem unten dargestellten Inhalt:

$ 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 lin diesem Verzeichnis laufen, /usr/share/wird auch alles durchsucht (und das kann sehr lange dauern) 1 .Für einen findBefehl, der "immun gegen ausgehende Links" ist, verwenden Sie nicht-L.


1 Dies mag wie eine kleine Unannehmlichkeit aussehen (der Befehl braucht „nur“ lange, um alle zu durchlaufen /usr/share), kann aber schwerwiegendere Folgen haben. Betrachten Sie beispielsweise Chroot-Umgebungen: Sie können in einem Unterverzeichnis des Hauptdateisystems vorhanden sein und Symlinks zu absoluten Orten enthalten. Diese Links könnten für das „externe“ System defekt erscheinen, da sie erst nach dem Eintritt in die Chroot auf die richtigen Orte zeigen. Ich erinnere mich auch, dass einige Bootloader Symlinks verwendeten, /bootdie nur in einer anfänglichen Bootphase Sinn machten, wenn die Bootpartition als gemountet war /.

Wenn Sie also einen find -LBefehl verwenden, um defekte symbolische Links in einem harmlos aussehenden Verzeichnis zu suchen und zu löschen, kann dies sogar Ihr System beschädigen ...

Antwort2

Wie rozcietrzewiacz bereits kommentiert hat, find -Lkann die Ausweitung der Suche auf symbolisch verknüpfte Verzeichnisse unerwartete Folgen haben und ist daher nicht der optimale Ansatz. Was bisher niemand erwähnt hat, ist, dass

find /path/to/search -xtype l

ist der prägnantere und logisch identische Befehl zu

find /path/to/search -type l -xtype l

Keine der bisher vorgestellten Lösungen erkennt zyklische symbolische Links, die eine andere Art von Störung darstellen. diese Fragebefasst sich mit der Portabilität. Zusammenfassend lässt sich sagen, dass die portable Methode zum Auffinden defekter symbolischer Links, einschließlich zyklischer Links, folgendermaßen aussieht:

find /path/to/search -type l -exec test ! -e {} \; -print

Weitere Einzelheiten finden Sie unterdiese Frageoderynform.org. Die definitive Quelle für all dies ist natürlich dieFindutils-Dokumentation.

Antwort3

Der symlinksBefehl vonhttp://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gzkann verwendet werden, um symbolische Links mit einer Vielzahl von Merkmalen zu identifizieren. Zum Beispiel:

$ rm a
$ ln -s a b
$ symlinks .
dangling: /tmp/b -> a

Antwort4

Ich glaube, -Ldass Sie durch das Hinzufügen des Flags zu Ihrem Befehl Folgendes loswerden können grep:

$ find -L . -type l

http://www.commandlinefu.com/commands/view/8260/find-broken-symlinks

aus dem Handbuch:

-L

Bewirkt, dass die Dateiinformationen und der Dateityp (siehe stat(2)), die für jeden symbolischen Link zurückgegeben werden, diejenigen der Datei sind, auf die der Link verweist, und nicht des Links selbst. Falls die referenzierte Datei nicht existiert, beziehen sich die Dateiinformationen und der Dateityp auf den Link selbst.

verwandte Informationen