Listez les répertoires profondément imbriqués en premier.
find . -depth -type d -exec rmdir {} \; 2>/dev/null
(Notez que la redirection s’applique à la findcommande dans son ensemble, pas seulement rmdir. Redirection uniquement pour rmdirprovoquerait un ralentissement important, car vous auriez besoin d’appeler un shell intermédiaire.)
Vous pouvez éviter de s'exécuter rmdirsur des répertoires non vides en transmettant le -emptyprédicat à rechercher. GNU find teste le répertoire lorsqu'il est sur le point d'exécuter la commande. Ainsi, les répertoires qui viennent d'être vides seront récupérés.
find . -depth -type d -empty -exec rmdir {} \;
Une autre façon d'accélérer serait de regrouper les rmdirinvocations. Les deux sont susceptibles d'être sensiblement plus rapides que l'original, en particulier sous Cygwin. Je ne m'attends pas à beaucoup de différence entre ces deux.
find . -depth -type d -print0 | xargs -0 rmdir 2>/dev/null
find . -depth -type d -exec rmdir {} + 2>/dev/null
La méthode la plus rapide dépend du nombre de répertoires non vides que vous avez. Vous ne pouvez pas combiner -emptydes méthodes de regroupement d'appels, car les répertoires qui ne contiennent que des répertoires vides ne sont pas vides pour le moment find.
Une autre méthode consiste à exécuter plusieurs passes. Cela dépend de nombreux facteurs, notamment de la possibilité que toute la hiérarchie des répertoires reste dans le cache du disque entre les findexécutions.
while [ -n "$(find . -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done
Sinon, utilisez zsh. Le qualificatif glob F correspond aux répertoires non vides, donc aux /^Frépertoires vides. Les répertoires qui ne contiennent que des répertoires vides ne peuvent pas être appariés aussi facilement.
while rmdir **/*(/N^F); do :; done
(Cela se termine lorsque rmdirreçoit une ligne de commande vide.)