Wie kann ich alle leeren Dateien und Verzeichnisse in einem übergeordneten Verzeichnis rekursiv bereinigen?
Nehmen wir an, ich habe diese Verzeichnisstruktur:
Parent/
|____Child1/
|______ file11.txt (empty)
|______ Dir1/ (empty)
|____Child2/
|_______ file21.txt
|_______ file22.txt (empty)
|____ file1.txt
Ich sollte mit Folgendem enden:
Parent/
|____Child2/
|_______ file21.txt
|____ file1.txt
Antwort1
Dies ist ein wirklich einfacher Einzeiler:
find Parent -empty -delete
Es ist ziemlich selbsterklärend. Als ich es jedoch überprüfte, war ich überrascht, dass es Parent/Child1 erfolgreich löscht. Normalerweise würde man erwarten, dass es das übergeordnete Element vor dem untergeordneten Element verarbeitet, sofern Sie nichts anderes angeben -depth
.
Dies funktioniert, weil -delete
impliziert -depth
. Siehe dieGNU Find-Handbuch:
-delete
Dateien löschen; wahr, wenn das Entfernen erfolgreich war. Wenn das Entfernen fehlgeschlagen ist, wird eine Fehlermeldung ausgegeben. Wenn -delete fehlschlägt, ist der Beendigungsstatus von find ungleich Null (wenn es schließlich beendet wird). Die Verwendung von -delete aktiviert automatisch die Option -depth.
Beachten Sie, dass diese Funktionen nicht Teil derPosix-Standard, aber höchstwahrscheinlich wird es unter vielen Linux-Distributionen vorhanden sein. Sie könnten ein spezielles Problem mit kleineren Distributionen wie Alpine Linux haben, da diese aufBusyboxwas nicht unterstützt -empty
.
Andere Systeme, die nicht standardmäßige -empty
und -delete
enthaltenBSDUndOSXaber anscheinend nichtAIX.
Antwort2
Hier ist eine Lösung mit zwei Befehlen
Leere Dateien löschen
find Parent/ -type f -size 0 -delete
Versuchen Sie zu entfernenalleVerzeichnisse
find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>/dev/null
NB: rmdir
Es können keine nicht leeren Verzeichnisse gelöscht werden. Daher ist die Ausführung sicher, es treten jedoch Fehler auf, die wir hier verbergen.
Wie oben, aber etwas genauer in Bezug auf die ignorierten Fehlermeldungen. Eventuell muss dies geändert werden, wenn die Meldung bei verschiedenen Distributionen unterschiedlich ist.
find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>&1 \
| grep -iv "Directory not empty$"