Listen Sie die tief verschachtelten Verzeichnisse zuerst auf.
find . -depth -type d -exec rmdir {} \; 2>/dev/null
(Beachten Sie, dass die Umleitung für den find
gesamten Befehl gilt , nicht nur für rmdir
. Eine Umleitung nur für rmdir
würde zu einer erheblichen Verlangsamung führen, da Sie eine Zwischen-Shell aufrufen müssten.)
Sie können die Ausführung rmdir
in nicht leeren Verzeichnissen vermeiden, indem Sie das zu -empty
suchende Prädikat übergeben. GNU find testet das Verzeichnis, wenn es darum geht, den Befehl auszuführen, so dass Verzeichnisse, die gerade geleert wurden, aufgenommen werden.
find . -depth -type d -empty -exec rmdir {} \;
Eine andere Möglichkeit zur Beschleunigung besteht darin, die rmdir
Aufrufe zu gruppieren . Beide dürften spürbar schneller sein als das Original, insbesondere unter Cygwin. Ich erwarte keinen großen Unterschied zwischen diesen beiden.
find . -depth -type d -print0 | xargs -0 rmdir 2>/dev/null
find . -depth -type d -exec rmdir {} + 2>/dev/null
Welche Methode schneller ist, hängt davon ab, wie viele nicht leere Verzeichnisse Sie haben. Sie können nicht -empty
mit Methoden zum Gruppieren von Aufrufen kombinieren , da dann die Verzeichnisse, die nur leere Verzeichnisse enthalten, zum Zeitpunkt der find
Betrachtung nicht leer sind.
Eine andere Methode wäre, mehrere Durchläufe durchzuführen. Ob dies schneller ist, hängt unter anderem davon ab, ob die gesamte Verzeichnishierarchie zwischen den find
Durchläufen im Festplatten-Cache verbleiben kann .
while [ -n "$(find . -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done
Alternativ können Sie auch zsh verwenden. Das Glob-Qualifikationsmerkmal F
stimmt mit nicht leeren Verzeichnissen /^F
überein , entspricht also leeren Verzeichnissen. Verzeichnisse, die nur leere Verzeichnisse enthalten, können nicht so einfach abgeglichen werden.
while rmdir **/*(/N^F); do :; done
(Dies wird beendet, wenn rmdir
eine leere Befehlszeile empfangen wird.)