Dies ist ein wirklich einfacher Einzeiler:
find Parent -empty -delete
Es ist ziemlich selbsterklärend. Obwohl ich beim Überprüfen überrascht war, dass Parent/Child1 erfolgreich gelöscht wurde. Normalerweise würden Sie erwarten, dass das übergeordnete Element vor dem untergeordneten Element verarbeitet wird, es sei denn, Sie geben -depth
an .
Das funktioniert, weil -delete
impliziert -depth
. Siehe das GNU find-Handbuch:
-delete
Dateien löschen; true, wenn die Entfernung erfolgreich war. Wenn das Entfernen fehlgeschlagen ist, wird eine Fehlermeldung ausgegeben. Wenn -delete fehlschlägt, ist der Exit-Status von find ungleich Null (wenn es schließlich beendet wird). Die Verwendung von -delete schaltet automatisch die Option -depth ein.
Beachten Sie, dass diese Funktionen nicht Teil des Posix-Standards sind, aber höchstwahrscheinlich unter vielen Linux-Distributionen vorhanden sein werden. Möglicherweise haben Sie ein spezielles Problem mit kleineren wie Alpine Linux, da sie auf Busybox basieren, das -empty
nicht unterstützt .
Andere Systeme, die nicht standardmäßige -empty
enthalten und -delete
gehören BSD und OSX, aber anscheinend nicht AIX.
Hier ist eine Lösung mit zwei Befehlen
Leere Dateien löschen
find Parent/ -type f -size 0 -delete
Versuchen Sie, alle zu entfernen Verzeichnisse
find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>/dev/null
NB rmdir
kann keine nicht-leeren Verzeichnisse entfernen, daher ist es sicher auszuführen, wird aber Fehler produzieren, die wir verstecken
Wie oben, aber etwas genauer, was die Fehlermeldungen betrifft, die ignoriert werden. Möglicherweise müssen Änderungen vorgenommen werden, wenn die Meldung zwischen Distributionen unterschiedlich ist.
find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>&1 \
| grep -iv "Directory not empty$"
Sie können dies auch mit dem fd
tun Werkzeug:
fd -t e -x rm -r
https://github.com/sharkdp/fd