Exclua os arquivos mais antigos na pasta se o tamanho combinado da pasta for maior que 10G

0

A sintaxe a seguir removerá os arquivos na pasta hive :

/usr/bin/find /var/log/hive -type f -print -delete

Estou tentando fazer o seguinte:

Remova os arquivos mais antigos em /var/log/hive apenas se o tamanho da pasta for maior que 10G

OBSERVAÇÃO - o processo de exclusão será interrompido quando o tamanho abaixo da pasta da seção for exatamente 10G, portanto, o processo de eliminação começará se o tamanho for maior que 10G

Podemos criar essa solução com o comando find ou talvez com outra abordagem?

    
por yael 09.08.2018 / 14:17

3 respostas

4

Em um sistema GNU, você poderia fazer algo como:

cd /var/log/hive &&
  find . -type f -printf '%T@ %b :%p
find . -type f -printf '%T@ %b :%p
cd /var/log/hive &&
  find . \( -type f -name '*.wsp' -printf WSP -o -printf OTHER \) \
     -printf ' %T@ %b :%p
cd /var/log/hive &&
  find . -type f -printf '%T@ %b :%p
find . -type f -printf '%T@ %b :%p
cd /var/log/hive &&
  find . \( -type f -name '*.wsp' -printf WSP -o -printf OTHER \) \
     -printf ' %T@ %b :%p%pre%' |
    sort -zk 1,1 -k2,2rn |
    gawk -v RS='%pre%' -v ORS='%pre%' '
      BEGIN {max = 10 * 1024 * 1024 * 1024} # 10 GiB
      {du += 512 * $3}
      du > max && $1 == "WSP" {
        sub("[^:]*:", ""); print
      }' | xargs -r0 echo rm -f
' |sort -zrn|gawk -vRS='%pre%' -vORS='%pre%' '{du+=512*$2};du>10*(2^30){sub("[^:]*:","");print}'|xargs -r0 echo rm -f
' | sort -zrn | gawk -v RS='%pre%' -v ORS='%pre%' ' BEGIN {max = 10 * 1024 * 1024 * 1024} # 10GiB; use max=10e9 for 10GB {du += 512 * $2} du > max { sub("[^:]*:", ""); print }' | xargs -r0 echo rm -f
' | sort -zk 1,1 -k2,2rn | gawk -v RS='%pre%' -v ORS='%pre%' ' BEGIN {max = 10 * 1024 * 1024 * 1024} # 10 GiB {du += 512 * $3} du > max && $1 == "WSP" { sub("[^:]*:", ""); print }' | xargs -r0 echo rm -f
' |sort -zrn|gawk -vRS='%pre%' -vORS='%pre%' '{du+=512*$2};du>10*(2^30){sub("[^:]*:","");print}'|xargs -r0 echo rm -f
' | sort -zrn | gawk -v RS='%pre%' -v ORS='%pre%' ' BEGIN {max = 10 * 1024 * 1024 * 1024} # 10GiB; use max=10e9 for 10GB {du += 512 * $2} du > max { sub("[^:]*:", ""); print }' | xargs -r0 echo rm -f

Isso é ordenar os arquivos regulares pela última modificação (do mais recente ao mais antigo), contar o uso cumulativo de disco (supondo que não haja links físicos) e excluir todos os arquivos quando passarmos do limite de 10GiB.

Observe que não leva em consideração o tamanho dos próprios arquivos de diretório. Considera apenas o uso do disco de arquivos regulares.

Remova echo quando estiver satisfeito com o resultado.

Em uma linha:

%pre%

Para excluir apenas arquivos * .wsp quando o uso cumulativo do disco de todos os arquivos comuns ultrapassar 10GiB, você desejará listar os arquivos não wsp primeiro. E, ao mesmo tempo, também podemos explicar o uso do disco de diretórios e outros arquivos não regulares que estávamos perdendo anteriormente:

%pre%     
por 09.08.2018 / 14:58
1

Tente isso,

Opção 1: Para excluir pasta com mais de 90 dias e mais de 10 G

find /var/log/hive -size +10G -mtime +90 -type f -print -delete

Opção 2: Para excluir a pasta mais antiga

find /var/log/hive -size +10G -type f -printf '%T+ %p\n' | sort | head -n 1 | cut -d" " -f2 | xargs rm
    
por 09.08.2018 / 14:32
1

Que tal

while test "$(du -s /var/log/hive | cut -f1)" -gt 10000000 ; do rm -i /var/log/hive/"$(ls -t /var/log/hive | tail -1)" ; done

?

    
por 09.08.2018 / 14:36

Tags