Excluindo graciosamente arquivos com mais de 30 dias

8

Eu tenho uma pasta de cache com um mínimo de 15000 arquivos.

Eu tentei isso:

find cache* -mtime +30 -exec rm {} \;

Mas isso fez minha carga do servidor voar para o céu!

Existe alguma solução mais rápida / melhor ?

Ou posso limitar a velocidade ou as iterações deste comando?

    
por Kristian 06.11.2012 / 09:43

4 respostas

8

Eu gosto de usar tmpwatch para essas coisas, é a última vez que o arquivo foi modificado . É simples e funciona bem em muitos casos:

tmpwatch -m 720 /path/to/cache

Para o Ubuntu, verifique tmpreaper em seu lugar.

Se você quiser verificar a última vez que o arquivo foi acessado, use o seguinte:

tmpwatch -a 720 /path/to/cache

Você não pode usar tmpwatch -a em sistemas de arquivos montados com noatime. você ainda pode usar -m

    
por 06.11.2012 / 10:46
6

Você pode evitar a desova de um novo processo para cada arquivo usando

find cache* -mtime +30 -delete
    
por 06.11.2012 / 12:31
3

Tente executar o acima com bom:

nice -n 39 find cache* -mtime +30 -exec rm -f {} ';'

Dessa forma, a carga enorme só aparecerá se nada mais precisar ser executado, caso contrário, os outros processos terão precedência (se sua afinidade for menor que 19, ou seja, o máximo).

Note que o argumento para a opção -n é adicionado ao valor padrão que varia entre -20 e 19. Eu usei 39 para que seja muito legal, independentemente da gentileza original que havia .

    
por 06.11.2012 / 10:36
2

Como comentado por chiborg, a carga deve começar com rm para cada arquivo encontrado. Percebi a resposta em que tmpwatch é sugerido como uma alternativa, que tenho certeza que funciona bem. No entanto, não é necessário.

Find pode executar o comando dado ao exec uma vez, se você disser para acumular os arquivos encontrados em uma lista de argumentos como:

find /path -name "*.moo" -exec rm {} \+

Às vezes, isso pode não funcionar porque a lista de argumentos pode ficar maior (em bytes) do que o máximo permitido pelo shell (getconf ARG_MAX). Isso pode ser resolvido por xargs com a opção -L.

considere este exemplo:

$ echo 0 > /tmp/it; 
$ for i in {0..15000};do echo $i;done  |\
    xargs --no-run-if-empty -L 5000 ./tmp/xr.sh 
Iteration=0; running with 5000 arguments
Iteration=1; running with 5000 arguments
Iteration=2; running with 5000 arguments
Iteration=3; running with 1 arguments

$ cat tmp/xr.sh 
#!/bin/sh
IT='cat /tmp/it'
echo Iteration=$IT\; running with $# arguments
let IT=IT+1
echo $IT > /tmp/it

Portanto, não há necessidade de instalar software extra, tudo que você precisa está no gnu-findutils:

find /path -mtime +30 -print0 | xargs -0 -L 5000 rm 
    
por 06.11.2012 / 13:58