Wymień katalogi głęboko zagnieżdżone jako pierwsze.
find . -depth -type d -exec rmdir {} \; 2>/dev/null
(Zauważ, że przekierowanie dotyczy całego find
polecenia, a nie tylko rmdir
. Przekierowanie tylko dla rmdir
spowoduje znaczne spowolnienie, ponieważ będziesz musiał wywołać powłokę pośrednią).
Możesz uniknąć uruchamiania rmdir
niepustych katalogów, przekazując -empty
predykat 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 rmdir
wywoł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ć -empty
z metodami grupowania wywołań, ponieważ wtedy katalogi zawierające tylko puste katalogi nie są puste, dopóki się na nie nie find
spojrzy.
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 find
uruchomieniami.
while [ -n "$(find . -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done
Alternatywnie użyj zsh. Glob kwalifikator F
mecze niepuste katalogi, więc /^F
pasuje 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 rmdir
otrzymuje pusty wiersz poleceń).