Frage Löschen Sie alle unterbrochenen symbolischen Links mit einer Linie?


Wie kann ich alle defekten Links in einem bestimmten Ordner löschen?

ich fand diese Antwort das zeigt, wie man einen defekten Link löscht, aber ich kann das nicht in nur einer Zeile zusammenfassen. Gibt es dafür einen One-Liner?

Ein gebrochener symbolischer Link ist eine Verknüpfung, die auf eine Datei / Ordner verweist, die nicht mehr existiert.


35
2018-02-28 13:56


Ursprung


Antworten:


Hier ist eine POSIX-Möglichkeit zum Löschen aller gebrochenen symbolischen Links im aktuellen Verzeichnis ohne Rekursion. Es funktioniert, indem es erzählt find symbolische Links zu durchqueren (-L), aber halt (-prune) bei jedem Verzeichnis-oder-symbolische-Link-zu-so.

find -L . -name . -o -type d -prune -o -type l -exec rm {} +

Sie können auch eine Shell-Schleife verwenden. Der Test -L Übereinstimmungen mit symbolischen Links und -e passt vorhandene Dateien an (ohne gebrochene Symlinks).

for x in * .[!.]* ..?*; do if [ -L "$x" ] && ! [ -e "$x" ]; then rm -- "$x"; fi; done

Wenn Sie in Unterverzeichnisse recurse möchten, funktioniert diese Technik nicht. Mit GNU find (wie auf nicht eingebetteten Linux und Cygwin gefunden) können Sie die -xtype Prädikat zur Erkennung gebrochener symbolischer Links (-xtype verwendet den Typ des Ziels für symbolische Links und Berichte l für defekte Links).

find -xtype l -delete

POSIXly, müssen Sie zwei Werkzeuge kombinieren. Sie können verwenden find -type l -exec … um einen Befehl für jede symbolische Verbindung aufzurufen, und [ -e "$x" ] um zu testen, ob diese Verbindung nicht unterbrochen ist.

find . -type l -exec sh -c 'for x; do [ -e "$x" ] || rm "$x"; done' _ {} +

Die einfachste Lösung ist die Verwendung von zsh. So löschen Sie alle beschädigten symbolischen Links im aktuellen Verzeichnis:

rm -- *(-@D)

Die Zeichen in Klammern sind Glob Qualifier: - um Symlinks zu dereferenzieren, @ um nur symbolische Verknüpfungen zu finden (die Kombination -@ bedeutet nur gebrochene symbolische Links), und D um Punktdateien zu vergleichen. Um in Unterverzeichnisse zu rekrutieren, mach das rm -- **/*(-@D).


58
2018-02-28 15:19



Einfache Antwort basierend auf der Antwort, die Sie verknüpft haben (für ein bestimmtes Verzeichnis, $DIR):

find -L $DIR -maxdepth 1 -type l -delete

15
2018-02-28 17:51



Antwort basierend auf der akzeptierten Antwort auf die Frage Frage "Wie kann ich gebrochene symbolische Links finden?":

find . -type l -! -exec test -e {} \; -print | xargs rm

5
2017-10-31 09:12



Von man find Beispiele:

find -L /usr/ports/packages -type l -exec rm -- {} +

Löschen Sie alle beschädigten symbolischen Links in / usr / ports / packages.


4
2018-02-03 10:37



Zum MAC, mache einen Trockenlauf wie folgt:

DIR=<some path>
find -L $DIR -maxdepth 1 -type l -print

Jetzt können Sie die alten Symlinks wie folgt beschneiden:

for f in `find -L $DIR -maxdepth 1 -type l`; do unlink $f; done

2
2017-07-21 08:42



Du könntest benutzen readlink um festzustellen, ob ein Symlink unterbrochen ist oder nicht.

Im Folgenden werden alle fehlerhaften symbolischen Verknüpfungen in einem bestimmten Verzeichnis (und Unterverzeichnissen) aufgelistet:

find . -type l -exec sh -c 'readlink -f "{}" 1>/dev/null || echo "{}"' -- "{}" \;

Ersetzen echo mit rm um die gebrochenen loszuwerden!

(Ich habe die Ausgabe von readlink zu /dev/null um Verwirrung zu vermeiden; Es würde das Ziel für die symbolischen Links auflisten.)


1
2018-02-28 14:45



Das Paket symlinks ist auf vielen Distributionen vorinstalliert (einschließlich Ubuntu 16.04 & Fedora 25) und hat einige wirklich nützliche Funktionen, von denen eine genau das macht, wonach Sie suchen:

symlinks -d ./

1
2018-05-20 16:36