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.