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?
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?
Respostas:
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 -delete
vez 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 cron
diretório apropriado como /etc/cron.daily
ou /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.
Conforme observado abaixo, a -delete
opção para find
nã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.
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-execdir
que atenua essas vulnerabilidades.
/a/b/c/[12]
, mas isso só é realmente apropriado se os subdiretórios tiverem nomes de letras únicas. Em bash
você pode fazer /a/b/c/{1,2}
. É claro que a linha estrita de um script teria que ser #!/bin/bash
ou, 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).
ksh
, bash
e zsh
també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 -execdir
que atenua essas vulnerabilidades.
rm -f
lida com erros silenciosamente, lidando com qualquer condição de corrida possível -exec
?
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.
tmpwatch
foi bifurcada tmpreaper
, o que (pelo menos no Debian) parece ser a sua substituição.
/a/b/c/
ele não precise ser especificado para todas as opções?