Como faço para excluir todos os diretórios vazios

11

(em um sistema Linux)

Eu tenho um grande conjunto de subdiretórios aninhados em um sistema de arquivos. Gostaria de remover todos os caminhos de diretório que não contêm arquivos.

Em outras palavras, eu gostaria de excluir todos os diretórios onde não há arquivos nesse diretório ou em qualquer subdiretório desse diretório recursivamente.

AndrewR
fonte

Respostas:

15

Para todas as versões do find

find -depth -type d -empty -exec rmdir {} \;

Se você tem uma versão mais recente

 find -type d -empty -delete
Mike
fonte
legal, não conhecia a -deletebandeira.
Ansi_lumen
Nem eu. Eu aprendi algo novo. Eu escrevi scripts antes, usando a recursão para encontrar diretórios vazios. Isso simplifica bastante essa tarefa.
James
2
ya a bandeira -vazy realmente ajuda aqui. Ele também funciona para encontrar arquivos vazios se você não incluiu o -type d ou apenas utilizado -type f
Mike
1

Pode não ser a melhor solução, mas este script funciona:

#!/bin/sh

while true
do
    DIRS=`find . -xdev -type d -exec find {}  -maxdepth 0 -empty  \;`
    if [ -z "$DIRS" ]; then
        exit 0
    else
        echo $DIRS | xargs rmdir
    fi
done

(baseado parcialmente na resposta para Listar todas as pastas vazias )

AndrewR
fonte
1
Apenas me ocorreu que este vai entrar em um loop infinito se você não tem permissão para remover qualquer um dos diretórios vazios, portanto use a resposta aceita vez :)
AndrewR
0
for i in `find -type d -empty`; do rmdir $i; done
ansi_lumen
fonte
Perto, mas sem charuto. Está faltando o caso em que a remoção de um diretório faz com que seu pai fique vazio.
Simon Richter
Isso é verdade. Eu os faria findem uma segunda corrida. Nunca tive esse caso ao vivo.
Ansi_lumen