
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
find
und von der GNU-Implementierung ausgehenfind
, sollte es eher so aussehen:find . -xtype l
(
xtype
ist ein Test, der an einem dereferenzierten Link durchgeführt wird)Portabel (wenn auch weniger effizient) können Sie die Ausführung auch
test -e
innerhalb desfind
Befehls durchführen:find . -type l ! -exec test -e {} \; -print
Sogar einige
grep
Tricks könnten besser sein (z. B.sicherer) alsfind -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 -L
zitierte 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 l
in diesem Verzeichnis laufen, /usr/share/
wird auch alles durchsucht (und das kann sehr lange dauern) 1 .Für einen find
Befehl, 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, /boot
die nur in einer anfänglichen Bootphase Sinn machten, wenn die Bootpartition als gemountet war /
.
Wenn Sie also einen find -L
Befehl 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 -L
kann 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 symlinks
Befehl 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, -L
dass 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.