Liste os diretórios profundamente aninhados primeiro.
find . -depth -type d -exec rmdir {} \; 2>/dev/null
(Observe que o redirecionamento se aplica ao find
comando como um todo, não apenas ao rmdir
. Redirecionar apenas para rmdir
causaria uma desaceleração significativa, pois você precisaria chamar um shell intermediário.)
Você pode evitar a execução rmdir
em diretórios não vazios, passando o -empty
predicado 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 rmdir
invocaçõ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 -empty
com métodos para agrupar chamadas, porque os diretórios que contêm apenas diretórios vazios não ficam vazios quando os find
olha.
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 find
execuçõ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, /^F
corresponde 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 rmdir
recebe uma linha de comando vazia.)