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.)