Liste os diretórios profundamente aninhados primeiro.
find . -depth -type d -exec rmdir {} \; 2>/dev/null
(Observe que o redirecionamento se aplica ao findcomando como um todo, não apenas ao rmdir. Redirecionar apenas para rmdircausaria uma desaceleração significativa, pois você precisaria chamar um shell intermediário.)
Você pode evitar a execução rmdirem diretórios não vazios, passando o -emptypredicado para localizar. O GNU find testa o diretório quando está prestes a executar o comando, para que os diretórios que acabaram de ser esvaziados sejam escolhidos.
find . -depth -type d -empty -exec rmdir {} \;
Outra maneira de acelerar seria agrupar as rmdirinvocações. É provável que ambos sejam visivelmente mais rápidos que o original, especialmente no Cygwin. Não espero muita diferença entre esses dois.
find . -depth -type d -print0 | xargs -0 rmdir 2>/dev/null
find . -depth -type d -exec rmdir {} + 2>/dev/null
Qual método é mais rápido depende de quantos diretórios não vazios você possui. Você não pode combinar -emptycom métodos para agrupar chamadas, porque os diretórios que contêm apenas diretórios vazios não ficam vazios quando os findolha.
Outro método seria executar várias passagens. Se isso é mais rápido depende de muitas coisas, incluindo se toda a hierarquia de diretórios pode permanecer no cache do disco entre as findexecuções.
while [ -n "$(find . -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done
Como alternativa, use zsh. O qualificador glob F corresponde a diretórios não vazios, portanto, /^Fcorresponde a diretórios vazios. Diretórios que contêm apenas diretórios vazios não podem ser correspondidos tão facilmente.
while rmdir **/*(/N^F); do :; done
(Isso termina quando rmdirrecebe uma linha de comando vazia.)