Wymień katalogi głęboko zagnieżdżone jako pierwsze.
find . -depth -type d -exec rmdir {} \; 2>/dev/null
(Zauważ, że przekierowanie dotyczy całego findpolecenia, a nie tylko rmdir. Przekierowanie tylko dla rmdirspowoduje znaczne spowolnienie, ponieważ będziesz musiał wywołać powłokę pośrednią).
Możesz uniknąć uruchamiania rmdirniepustych katalogów, przekazując -emptypredykat do znalezienia. GNU find sprawdza katalog, gdy ma zamiar uruchomić polecenie, więc katalogi, które właśnie zostały opróżnione, zostaną pobrane.
find . -depth -type d -empty -exec rmdir {} \;
Innym sposobem na przyspieszenie byłoby grupowanie rmdirwywołań. Oba będą prawdopodobnie zauważalnie szybsze niż oryginał, szczególnie pod Cygwinem. Nie oczekuję dużej różnicy między tymi dwoma.
find . -depth -type d -print0 | xargs -0 rmdir 2>/dev/null
find . -depth -type d -exec rmdir {} + 2>/dev/null
Która metoda jest szybsza, zależy od liczby niepustych katalogów. Nie można łączyć -emptyz metodami grupowania wywołań, ponieważ wtedy katalogi zawierające tylko puste katalogi nie są puste, dopóki się na nie nie findspojrzy.
Inną metodą byłoby uruchomienie wielu przebiegów. To, czy jest to szybsze, zależy od wielu rzeczy, w tym od tego, czy cała hierarchia katalogów może pozostać w pamięci podręcznej dysku między finduruchomieniami.
while [ -n "$(find . -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done
Alternatywnie użyj zsh. Glob kwalifikator F mecze niepuste katalogi, więc /^Fpasuje do pustych katalogów. Katalogów zawierających tylko puste katalogi nie można tak łatwo dopasować.
while rmdir **/*(/N^F); do :; done
(Kończy się, gdy rmdirotrzymuje pusty wiersz poleceń).