Posts Tagged ‘bash’

Linux

bash: rekursives Löschen leerer Verzeichnisse

21. Oktober 2010 – Kommentare deaktiviert

Rekursives Löschen leerer Verzeichnisse:

find -type d ! -name .|sort -r|while read dir; do \
rmdir --ignore-fail-on-non-empty "$dir"; done

Die Befehle bewirken folgendes:

find -type d ! -name . findet alle Verzeichnisse: Die Option ! -name . sorgt dafür, dass das aktuelle Verzeichnis (.) nicht in der Ergebnisliste enthalten ist und somit wirklich nur Unterverzeichnisse berücksichtigt werden. -type d beschränkt die Suche auf Verzeichnisse.

sort -r sortiert die Verzeichnisse dann in umgekehrter Reihenfolge.

--ignore-fail-on-non-empty verhindert die Fehlermeldung, dass ein Verzeichnis nicht gelöscht werden kann, weil es nicht leer ist.

Das entspricht dann bspw. den einzelnen Befehlen

rmdir --ignore-fail-on-non-empty ./dir3/dir4
rmdir --ignore-fail-on-non-empty ./dir3
rmdir --ignore-fail-on-non-empty ./dir1/dir2
rmdir --ignore-fail-on-non-empty ./dir1

Befindet sich bspw. in dir4 eine Datei, schlägt rmdir ./dir3/dir4 fehl, weil das Verzeichnis nicht leer ist. Der nächste Befehl schlägt ebenfalls fehl, da in dir3 noch dir4 enthält. Da im Beispiel dir1 und dir2 leer sind, werden beide entfernt.