Listar os diretórios profundamente aninhados primeiro.
find . -depth -type d -exec rmdir {} \; 2>/dev/null
(Observe que o redirecionamento se aplica ao comando find como um todo, não apenas a rmdir . Redirecionar apenas para rmdir causaria uma lentidão significativa, já que você precisaria invocar um shell intermediário.)
Você pode evitar a execução de rmdir em diretórios não vazios, passando o predicado -empty para localizar. O GNU encontra testes no diretório quando está prestes a executar o comando, então os diretórios que acabaram de ser esvaziados serão selecionados.
find . -depth -type d -empty -exec rmdir {} \;
Outra maneira de acelerar seria agrupar as invocações rmdir . Ambos são notavelmente mais rápidos que o original, especialmente no Cygwin. Eu 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ê tem. Você não pode combinar -empty com métodos para agrupar invocações, porque os diretórios que contêm apenas diretórios vazios não estão vazios no momento em que find olha para eles.
Outro método seria executar vários passos. Se isso é mais rápido, depende de muitas coisas, incluindo se toda a hierarquia de diretórios pode permanecer no cache de disco entre find runs.
while [ -n "$(find . -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done
Como alternativa, use zsh. O qualificador de glob F corresponde a diretórios não vazios, por isso /^F corresponde a vazio diretórios. 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 rmdir recebe uma linha de comando vazia.)