find script deve remover o dir vazio recursivamente depois de remover os arquivos nele

4

Eu tenho esse script de localização que localiza arquivos no diretório / home com mais de 100 MB de tamanho e exclui se ele tiver mais de 10 dias. Está agendado para todos os dias uma vez pelo cron job.

find /home/ -mtime +10 -type f -size +100M -delete >/dev/null 2>&1

Agora, quero que esse script remova diretórios de forma recursiva de onde ele remove arquivos, pois está deixando diretórios vazios.

Alguém poderia aconselhar ou sugerir que mudanças precisam ser feitas neste script?

    
por Atul 08.03.2017 / 16:50

3 respostas

6

Em um sistema GNU, você pode fazer:

find /home/ -mtime +10 -type f -size +100M -delete -printf '%h
files=(/home/**/*(D.LM+100m+10od))
rm -f $files
rmdir ${(u)files:h}
' | awk -v RS='
 find /home/ \( -mtime +10 -type f -size +100M -o -type d -empty \) -delete
' '!seen[$0]++ {out = out $0 RS} END {printf "%s", out}' | xargs -r0 rmdir

Usamos awk para filtrar duplicados enquanto mantemos o pedido (sai antes do ramo em que estão) e também atrasamos a impressão até que todos os arquivos tenham sido removidos, portanto rmdir pode remover diretórios vazios.

com zsh :

find /home/ -mtime +10 -type f -size +100M -delete -printf '%h
files=(/home/**/*(D.LM+100m+10od))
rm -f $files
rmdir ${(u)files:h}
' | awk -v RS='
 find /home/ \( -mtime +10 -type f -size +100M -o -type d -empty \) -delete
' '!seen[$0]++ {out = out $0 RS} END {printf "%s", out}' | xargs -r0 rmdir

Note que estes removeriam os diretórios que ficam vazios após arquivos serem removidos deles, mas não o pai daqueles diretórios se eles não tiverem nenhum desses arquivos para deletar e ficarem vazios como um resultado dos diretórios sendo removidos. Se você quiser removê-los também, com GNU rmdir , você pode adicionar a opção -p / --parents a rmdir .

Se você quisesse remover todos os diretórios vazios, independentemente de arquivos ou diretórios terem sido removidos deles ou não, ainda com o GNU find , você poderia fazer:

%pre%     
por 08.03.2017 / 17:05
2

Você não pode remover todos os dirs vazios em uma segunda execução depois ( find option -empty junto com -type d ?

    
por 08.03.2017 / 17:01
0
cd "/home" && \
find . -depth -type d ! -name . ! -empty -exec sh -c '
   find "$1" -mtime +10 -type f -size +100M -delete
' {} {} \; -empty -delete

Resumo

Precisamos que o GNU encontre o acima para funcionar. Sendo a ideia básica, invocamos find com o modo -depth     que força find a processar diretórios filhos antes dos pais. Então nós olhamos apenas     dirs e somente aqueles que não são vazios, impedindo assim que find exclua dirs vazios.

    
por 09.03.2017 / 11:50

Tags