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 findgesamten Befehl gilt , nicht nur für rmdir. Eine Umleitung nur für rmdirwürde zu einer erheblichen Verlangsamung führen, da Sie eine Zwischen-Shell aufrufen müssten.)
Sie können die Ausführung rmdirin nicht leeren Verzeichnissen vermeiden, indem Sie das zu -emptysuchende 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 rmdirAufrufe 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 -emptymit Methoden zum Gruppieren von Aufrufen kombinieren , da dann die Verzeichnisse, die nur leere Verzeichnisse enthalten, zum Zeitpunkt der findBetrachtung 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 findDurchlä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 rmdireine leere Befehlszeile empfangen wird.)