Hier ist eine POSIX Weise alle gebrochen symbolische Links im aktuellen Verzeichnis zu löschen , ohne Rekursion. Es funktioniert, indem man find
sagt, um symbolische Verbindungen (-L
) zu traversieren, aber (-prune
) bei jedem Verzeichnis-oder-symbolic-link-to-so zu stoppen.
find -L . -name . -o -type d -prune -o -type l -exec rm {} +
Sie können auch eine Shell-Schleife verwenden. Der Test -L
stimmt mit symbolischen Links überein, und -e
stimmt mit vorhandenen Dateien überein (ohne gebrochene symbolische Links).
for x in * .[!.]* ..?*; do if [ -L "$x" ] && ! [ -e "$x" ]; then rm -- "$x"; fi; done
Wenn Sie in Verzeichnisse rekursiv möchten, diese Technik funktioniert nicht. Mit GNU find (wie auf nicht eingebettetem Linux und Cygwin) können Sie das Prädikat -xtype
verwenden, um defekte symbolische Links zu erkennen (-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 find -type l -exec …
verwenden, 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. Um alle gebrochen symbolischen Links im aktuellen Verzeichnis zu löschen:
rm -- *([email protected])
Die Zeichen sind in Klammern angegeben glob qualifiers: -
zu dereferenzieren Symlinks, @
nur Symlinks entsprechen (die Kombination [email protected]
bedeutet gebrochen Symlinks nur) und D
zu Punkt übereinstimmen Dateien. Um in Unterverzeichnisse zu rekrutieren, machen Sie das rm -- **/*([email protected])
.
Gerade von "Mann finden": 'finden -L/usr/ports/packages Typ l exec rm - {} + alle gebrochen symbolische Links löschen in/usr/ports/packages.' –