Elenca prima le directory profondamente annidate.
find . -depth -type d -exec rmdir {} \; 2>/dev/null
(Si noti che il reindirizzamento si applica al findcomando nel suo insieme, non solo a rmdir. Il reindirizzamento solo per rmdircauserebbe un rallentamento significativo poiché sarebbe necessario invocare una shell intermedia.)
È possibile evitare l'esecuzione rmdirsu directory non vuote passando il -emptypredicato da trovare. GNU find verifica la directory quando sta per eseguire il comando, quindi verranno prese le directory che sono state appena svuotate.
find . -depth -type d -empty -exec rmdir {} \;
Un altro modo per accelerare sarebbe raggruppare le rmdirinvocazioni. È probabile che entrambi siano notevolmente più veloci dell'originale, specialmente con Cygwin. Non mi aspetto molta differenza tra questi due.
find . -depth -type d -print0 | xargs -0 rmdir 2>/dev/null
find . -depth -type d -exec rmdir {} + 2>/dev/null
Quale metodo è più veloce dipende da quante directory non vuote hai. Non puoi combinare -emptycon i metodi per raggruppare le invocazioni, perché le directory che contengono solo directory vuote non sono vuote quando le findguardano.
Un altro metodo sarebbe quello di eseguire più passaggi. La maggiore rapidità dipende da molte cose, incluso se l'intera gerarchia di directory può rimanere nella cache del disco tra le findesecuzioni.
while [ -n "$(find . -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done
In alternativa, usa zsh. Il qualificatore glob F corrisponde a directory non vuote, quindi /^Fcorrisponde a directory vuote. Le directory che contengono solo directory vuote non possono essere abbinate così facilmente.
while rmdir **/*(/N^F); do :; done
(Questo termina quando rmdirriceve una riga di comando vuota.)