Trabalho Cron para excluir arquivos com mais de 3 dias

21

Preciso remover arquivos com mais de 3 dias com um trabalho cron em 3 diretórios diferentes. (esses 3 diretórios são filhos de um diretório pai /a/b/c/1& /a/b/c/2& /a/b/c/3) Isso pode ser feito com uma linha no crontab?

KingKongFrog
fonte

Respostas:

26

Isso é bastante fácil (embora observe que isso ocorre por um tempo de modificação há mais de 3 dias, uma vez que o tempo de criação está disponível apenas em determinados sistemas de arquivos com ferramentas especiais):

find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-delete

Remova o #antes da primeira -deletevez que tiver certeza de que está localizando os arquivos que deseja remover.

Para executá-lo pelo cron, eu provavelmente criaria um script executável (adicionaria um shebang - #!bin/shà linha superior do arquivo e o tornaria executável chmod a+x) e depois o colocaria em um crondiretório apropriado como /etc/cron.dailyou /etc/cron.weekly. Desde que você não precise de uma programação mais específica e que esses diretórios existam na sua distribuição.

Atualizar

Conforme observado abaixo, a -deleteopção para findnão é muito portátil. Uma abordagem compatível com POSIX seria:

find /a/b/c/1 /a/b/c/2 -type f -mtime +3 #-exec rm {} +

Remova novamente #quando tiver certeza de que possui os arquivos corretos.

Update2

Para citar Stéphane Chazelas comente abaixo:

Observe que -exec rm {} +há vulnerabilidades de condição de corrida que -delete(quando disponíveis) não possuem. Portanto, não o use em diretórios graváveis ​​por outros. Algumas descobertas também têm um -execdirque atenua essas vulnerabilidades.

Graeme
fonte
Obrigado! Existe uma maneira de especificar o diretório pai e, em seguida, os diretórios filho para que /a/b/c/ele não precise ser especificado para todas as opções?
precisa
Claro, em um shell POSIX você pode fazer /a/b/c/[12], mas isso só é realmente apropriado se os subdiretórios tiverem nomes de letras únicas. Em bashvocê pode fazer /a/b/c/{1,2}. É claro que a linha estrita de um script teria que ser #!/bin/bashou, se você estiver usando o crontab, precisará garantir que ele esteja configurado para uso bash(eu realmente não recomendo alterá-lo, se não estiver).
Graeme
2
A expansão de chaves é um recurso csh e também é suportada por ksh, bash, zsh e fish, para que você tenha uma grande variedade de conchas. ksh, bashe zshtambém possuem operadores de alternância em seus globos. Observe que -exec rm {} +há vulnerabilidades de condição de corrida que -delete(quando disponíveis) não possuem. Portanto, não o use em diretórios graváveis ​​por outros. Algumas descobertas também têm um -execdirque atenua essas vulnerabilidades.
Stéphane Chazelas
Não rm -flida com erros silenciosamente, lidando com qualquer condição de corrida possível -exec?
Acumenus 08/07/2015
9

Você ficaria muito melhor usando tmpwatch

tmpwatch recursively removes files which haven't been accessed for a given time. Normally, it's used to clean up directories which are used for temporary holding space such as /tmp.
Barry Chapman
fonte
2
tmpwatchfoi bifurcada tmpreaper, o que (pelo menos no Debian) parece ser a sua substituição.
Jaap