Como posso excluir recursivamente todos os arquivos e diretórios vazios no Linux?

Como posso excluir recursivamente todos os arquivos e diretórios vazios no Linux?

Como posso limpar recursivamente todos os arquivos e diretórios vazios em um diretório pai?

Digamos que eu tenha esta estrutura de diretórios:

Parent/
  |____Child1/
        |______ file11.txt (empty)
        |______ Dir1/ (empty)

  |____Child2/
        |_______ file21.txt
        |_______ file22.txt (empty)

  |____ file1.txt

Eu deveria terminar com isso:

Parent/
  |____Child2/
        |_______ file21.txt

  |____ file1.txt

Responder1

Este é um forro realmente simples:

find Parent -empty -delete

É bastante autoexplicativo. Embora quando verifiquei fiquei surpreso ao ver que ele excluiu com sucesso Parent/Child1. Normalmente você esperaria que ele processasse o pai antes do filho, a menos que você especifique -depth.

Isso funciona porque -deleteimplica -depth. Veja oManual de localização do GNU:

-deleteDeletar arquivos; true se a remoção for bem-sucedida. Se a remoção falhar, uma mensagem de erro será emitida. Se -delete falhar, o status de saída do find será diferente de zero (quando ele finalmente sair). O uso de -delete ativa automaticamente a opção -profundidade.


Observe que esses recursos não fazem parte doPadrão Posix, mas provavelmente estará presente em muitas distribuições Linux. Você pode ter um problema específico com os menores, como o Alpine Linux, pois eles são baseados emCaixa ocupadaque não suporta -empty.

Outros sistemas que incluem não padronizados -emptye -deleteincluemBSDeOSXmas aparentemente nãoAIX.

Responder2

Aqui está uma solução de dois comandos

Exclua arquivos vazios

find Parent/ -type f -size 0 -delete

Tente removertodosdiretórios

find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>/dev/null

NB rmdirnão pode remover diretórios não vazios, portanto é seguro executá-lo, mas produzirá erros, que estamos escondendo

Como acima, mas sendo um pouco mais específico sobre as mensagens de erro que estão sendo ignoradas. Pode ser necessário alterar se a mensagem variar entre as distros.

find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>&1 \
  | grep -iv "Directory not empty$"

Responder3

Você também pode fazer isso com a fdferramenta:

fd -t e -x rm -r

https://github.com/sharkdp/fd

informação relacionada