cron job para remover arquivos com nome específico

1

Eu tenho isso no meu crontab

0 3 * * * mysqldump --host=10.100.100.3 --user=username --password=mypass --routines DBName | gzip > /tmp/mysqldumps/mydb.'date +"\%Y-\%m-\%d"'.gz

agora preciso criar outro trabalho cron para fazer este cenário assumindo que estamos em 3 de maio de 2011 Eu quero remover o arquivo que foi criado há um mês ie. rm mydb.2011-04-03.gz

Alguma idéia de como gerar este cron job (como gerar o nome do arquivo a ser deletado)?

    
por Alaa Alomari 04.05.2011 / 14:39

4 respostas

9

Você tem opções serveral; Eu proponho dois deles:

Remova o arquivo por data (a cada dia, o diretório de destino será pesquisado por arquivos com mais de um mês e as correspondências serão excluídas):

10 3 * * * find /tmp/mysqldumps/ -maxdepth 1 -ctime +30 -exec rm {} \;

Remova o arquivo pelo nome:

10 3 * * * rm /tmp/mysqldumps/mydb.'date -d "last month" +'%Y-%m-%d.gz''

Eu prefiro o primeiro porque é mais robusto. Além disso, se o trabalho cron remover por algum motivo, um dia não for executado, no dia seguinte, o comando anterior fará o truque. No meu segundo exemplo, o arquivo não será excluído.

    
por 04.05.2011 / 15:01
4

Em vez de analisar o nome do arquivo, você também pode verificar o tempo de modificação de um arquivo.

O próximo comando procura no diretório /tmp/mysqldumps . Os nomes de arquivo que começam com mydb. e terminam em .gz , com mais de 30 dias, são removidos.

find /tmp/mysqldumps -name 'mydb.*.gz' -mtime +30 -exec rm {} \;
    
por 04.05.2011 / 15:02
2

Você pode remover arquivos com mais de 30 dias usando um comando como

rm -f 'find /tmp/mysqldumps -mtime +30 -name mydb.\*.gz'
    
por 04.05.2011 / 14:56
0

Para tarefas cron mais complexas que o seu exemplo, eu gosto de colocar as tarefas cron em scripts em ~ / cron /, então posso comentá-las sobre quem as escreveu, porque elas estão lá e quando foram instaladas.

Uma maneira de fazer as contas no seu encontro seria assim. Eu não iria incorporar isso em um one-liner, embora eu tenha certeza que é possível com vários escapes e coisas assim:


printf "%d-%02d-%02d" 'date +%Y' $(('date +%m'-1))  'date +%d'

(serverfault engoliu meus backticks ... acho que consegui mostrar)

IMHO, achado é melhor para remover arquivos. Procure arquivos que correspondam ao padrão anterior à data. É mais seguro e não deixa as coisas ao seu redor em períodos prolongados de queda de energia.

Pode até parecer limpo em uma linha de frente ... Vou procurar um exemplo.

Aha, aqui está um exemplo onde os arquivos "noooo" e "omg" são burlados por causa de algo no diretório ./findtest/:

$ ls -R
.:
findtest  noooooo  omg

./findtest: mydb- file is * mydb-old-file.gz $ rm 'find ./findtest/ -name mydb*' rm: cannot remove './findtest/mydb-': No such file or directory rm: cannot remove 'file': No such file or directory rm: cannot remove 'is': No such file or directory rm: cannot remove 'findtest': Is a directory $ ls -R .: findtest

./findtest: mydb- file is *

Boa maneira:


$ find ./findtest/ -name mydb* -exec rm {} \;
$ ls -R
.:
findtest  noooooo  omg

./findtest: $

    
por 04.05.2011 / 14:58