Перерахуйте каталоги глибоко вкладені першими.
find . -depth -type d -exec rmdir {} \; 2>/dev/null
(Зверніть увагу, що перенаправлення застосовується до findкоманди в цілому, а не лише до rmdir. Перенаправлення лише на назовні rmdirможе спричинити значне уповільнення, оскільки вам потрібно буде викликати проміжну оболонку.)
Ви можете уникнути запуску rmdirв непорожніх каталогах, передавши -emptyприсудок на пошук. GNU знаходить тести каталогів, коли збирається запустити команду, тому щойно випорожнені каталоги будуть вибрані.
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. Глоба відбіркові F матчі непустих каталогів, тому /^Fвідповідає порожнім каталогам. Каталоги, які містять лише порожні каталоги, не можуть бути зібрані так легко.
while rmdir **/*(/N^F); do :; done
(Це закінчується, коли rmdirнадходить порожній командний рядок.)