Перерахуйте каталоги глибоко вкладені першими.
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
надходить порожній командний рядок.)