Wie kann ich alle leeren Dateien und Verzeichnisse in Linux rekursiv löschen?

Wie kann ich alle leeren Dateien und Verzeichnisse in Linux rekursiv löschen?

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 -deleteimpliziert -depth. Siehe dieGNU Find-Handbuch:

-deleteDateien 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 -emptyund -deleteenthaltenBSDUndOSXaber 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: rmdirEs 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$"

Antwort3

Dies können Sie auch mit dem Tool tun fd:

fd -t e -x rm -r

https://github.com/sharkdp/fd

verwandte Informationen