Перечислите каталоги, глубоко вложенные в первую очередь.
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
получает пустую командную строку.)