Enumere los directorios profundamente anidados primero.
find . -depth -type d -exec rmdir {} \; 2>/dev/null
(Tenga en cuenta que la redirección se aplica al findcomando como un todo, no solo a rmdir. Redirigir solo para rmdircausaría una desaceleración significativa ya que necesitaría invocar un shell intermedio).
Puede evitar ejecutarse rmdiren directorios no vacíos pasando el -emptypredicado para buscar. GNU find prueba el directorio cuando está a punto de ejecutar el comando, por lo que se recogerán los directorios que se acaban de vaciar.
find . -depth -type d -empty -exec rmdir {} \;
Otra forma de acelerar sería agrupar las rmdirinvocaciones. Es probable que ambos sean notablemente más rápidos que el original, especialmente bajo Cygwin. No espero mucha diferencia entre estos dos.
find . -depth -type d -print0 | xargs -0 rmdir 2>/dev/null
find . -depth -type d -exec rmdir {} + 2>/dev/null
El método más rápido depende de cuántos directorios no vacíos tenga. No puede combinarse -emptycon métodos para agrupar invocaciones, porque los directorios que solo contienen directorios vacíos no están vacíos cuando los findmira.
Otro método sería ejecutar múltiples pases. Si esto es más rápido depende de muchas cosas, incluso si toda la jerarquía de directorios puede permanecer en el caché del disco entre findejecuciones.
while [ -n "$(find . -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done
Alternativamente, use zsh. El calificador glob F coincide con directorios no vacíos, por lo que /^Fcoincide con directorios vacíos. Los directorios que solo contienen directorios vacíos no pueden coincidir tan fácilmente.
while rmdir **/*(/N^F); do :; done
(Esto termina cuando rmdirrecibe una línea de comando vacía).