Excluindo graciosamente arquivos com mais de 30 dias

8

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

Eu tentei isso:

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

Mas isso fez o meu servidor carregar voar para o céu!

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

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

Kristian
fonte
11
Se for cache*expandido para muitos arquivos, tente algo como isso find . -name 'cache*' -mtime +30 -exec rm {} \;.
Jaap Ancianidade

Respostas:

10

Eu gosto de usar tmpwatchpara 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.

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

tmpwatch -a 720 /path/to/cache

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

WojonsTech
fonte
Eu estou usando Ubuntu 10.04.2 LTSe que comando não existe ..
Kristian
2
@ Kristian Verifique em tmpreapervez disso.
Slhck 6/11/12
Alguma armadilha ao usá-las para gerenciar sistemas de arquivos montados com a opção noatime?
AnonymousLurker
@AnonymousLurker Modifiquei a resposta para você
WojonsTech 6/12
6

Você pode evitar a geração de um novo processo para cada arquivo usando

find cache* -mtime +30 -delete
Chiborg
fonte
3

Tente executar o acima com bom:

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

Dessa forma, a enorme carga aparecerá apenas se nada mais precisar executar, caso contrário, os outros processos terão precedência (se a gentileza for menor que 19, ou seja, o máximo).

Observe que o argumento para a opção -n é adicionado à gentileza padrão que varia entre -20 e 19. Eu usei 39 para que seja muito agradável, independentemente da gentileza original.

DanielFetchinson
fonte
2

Conforme comentado por chiborg, o carregamento deve-se ao início do rm para cada arquivo encontrado. Notei a resposta em que tmpwatché sugerida como alternativa, o que tenho certeza de que funciona bem. No entanto, não é necessário.

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

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

Às vezes, isso pode falhar, pois a lista de argumentos pode aumentar (em bytes) que o máximo permitido pelo shell (getconf ARG_MAX). Isso pode ser resolvido pelo 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 o que você precisa está no gnu-findutils:

find /path -mtime +30 -print0 | xargs -0 -L 5000 rm 
Ярослав Рахматуллин
fonte
alguns d00d pensaram que seria útil adicionar -print0 e -0 para encontrar e xargs. Esses argumentos forçam seus comandos a usar o caractere nulo (\ 0) em vez de uma nova linha (\ n) para separar os argumentos. Isso é útil quando o nome do arquivo tem espaços ou novas linhas.
Ярослав Рахматуллин
(1) Você não precisa dizer \+; a planície +é boa o suficiente. (2) Isso não "falhará no trabalho, porque a lista de argumentos pode crescer muito ...".  find  … -exec … {} +fará a mesma coisa que xargsfará; ele executará o comando quantas vezes for necessário. Por exemplo (como no seu exemplo), se você tiver entre arquivos 15001 e 20000, findexecutaria o -execprograma 'd ( rm) quatro vezes.
G-Man Diz 'Reinstate Monica'