Перечислите каталоги, глубоко вложенные в первую очередь.
find . -depth -type d -exec rmdir {} \; 2>/dev/null
(Обратите внимание, что перенаправление применяется к findкоманде в целом, а не только к rmdir. Перенаправление только для rmdirможет привести к значительному замедлению, так как вам потребуется вызвать промежуточную оболочку.)
Вы можете избежать работы rmdirс непустыми каталогами, передав -emptyпредикат для поиска. GNU find проверяет каталог, когда он собирается выполнить команду, поэтому каталоги, которые только что были очищены, будут выбраны.
find . -depth -type d -empty -exec rmdir {} \;
Другой способ ускорить работу - сгруппировать rmdirвызовы. Оба, вероятно, будут заметно быстрее, чем оригинал, особенно при Cygwin. Я не ожидаю большой разницы между этими двумя.
find . -depth -type d -print0 | xargs -0 rmdir 2>/dev/null
find . -depth -type d -exec rmdir {} + 2>/dev/null
Какой метод быстрее, зависит от того, сколько у вас непустых каталогов. Вы не можете комбинировать -emptyс методами для группировки вызовов, потому что тогда каталоги, которые содержат только пустые каталоги, не являются пустыми к тому моменту, когда findони на них смотрят.
Другим способом было бы запустить несколько проходов. Быстрее ли это, зависит от многих вещей, в том числе от того, может ли вся иерархия каталогов оставаться в дисковом кэше между findзапусками.
while [ -n "$(find . -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done
Или используйте zsh. Спецификатор glob F соответствует непустым каталогам, поэтому /^Fсоответствует пустым каталогам. Каталоги, которые содержат только пустые каталоги, не могут быть сопоставлены так легко.
while rmdir **/*(/N^F); do :; done
(Это заканчивается, когда rmdirполучает пустую командную строку.)