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 -delete
implica -depth
. Veja oManual de localização do GNU:
-delete
Deletar 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 -empty
e -delete
incluemBSDeOSXmas 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 rmdir
nã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$"