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 find
commande dans son ensemble, pas seulement rmdir
. Redirection uniquement pour rmdir
provoquerait un ralentissement important, car vous auriez besoin d’appeler un shell intermédiaire.)
Vous pouvez éviter de s'exécuter rmdir
sur des répertoires non vides en transmettant le -empty
pré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 rmdir
invocations. 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 -empty
des 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 find
exé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 /^F
ré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 rmdir
reçoit une ligne de commande vide.)