Apagar arquivos antigos, mas manter um por semana / mês / ano

2

Eu tenho uma pasta com arquivos de log a cada ~ 10 minutos:

alfred_140810-190001.json
alfred_140810-191001.json
alfred_140810-192002.json
alfred_140810-193001.json
alfred_140810-194001.json
alfred_140810-195001.json
alfred_140810-200002.json
alfred_140810-201119.json
alfred_140810-202002.json
...

Como faço para isso?

  • excluir todos os arquivos com mais de uma semana, mas manter um por semana
  • excluir todos os arquivos com mais de um mês, mas manter um por mês
  • excluir todos os arquivos com mais de um ano, mas manter um por ano

Então eu quero um arquivo para as últimas quatro semanas (4 arquivos) um arquivo por mês (12 arquivos) e um por ano (o mesmo sistema como rsnapshot está classificando seus backups).

    
por rubo77 12.09.2014 / 01:22

2 respostas

2

Você quer logrotate link .

Provavelmente já está no seu sistema. Você só precisa configurá-lo. No entanto, é principalmente para o propósito de remover arquivos de log antigos e não sei se você pode configurá-lo para manter um arquivo.

O que você pode fazer

crie vários diretórios log , log.weekly , log.monthly e log.yearly

log sendo onde todos os arquivos de log vão. Crie

  • uma tarefa cron semanal que copia o arquivo de log mais recente de log para log.weekly ,
  • uma tarefa cron mensal que copia o arquivo de log mais recente de log para log.monthly e
  • uma tarefa cron anual que copia o arquivo de log mais recente de log para log.yearly .

Configure logrotate apropriadamente para os diferentes diretórios.

    #!/bin/bash

    NOW=$(date +%


    ls -rt1 ${LOG} | while read FILE
    do
        TVAL=$(stat --printf %W ${LOG}/${FILE})
        if [ $(ls -1 ${LOG.WEEKLY} | wc -l) ] -eq 0 ]
        then
             cp ${LOG}/${FILE} ${LOG.WEEKLY}/${FILE}
        else
             LAST_WEEKLY=$(ls -t1 ${LOG.WEEKLY} | head -n 1 | stat --printf %W)
             if [ $((${TVAL}-${LAST_WEEKLY})) -gt $((60*60*24*7)) ]
             then
                 cp ${LOG}/${FILE} ${LOG.WEEKLY}/${FILE}
             fi
        fi
   # repeat the above logic for month and year
   rm ${LOG}/${FILE} 
   done
    
por 12.09.2014 / 02:24
0

OK, eu faria isso assumindo que os logs estão sendo criados diariamente:

#!/bin/sh
day=$(date +%u)#To get a day of the week
day_num=$(date +%d) #To get the current day
month=$(date +%m) #To get the current month
year=$(date +%Y) #Get current year
date=$(date +%Y%m%d) #Get current date

if [ $day -eq 7 ] #Saving only Sunday log
then
    sunday_day=$(date +%Y%m%d) # Saving sunday day
    for (( i = 1; i < 7; i++ )) 
    do
        past_day=$(date -d "-$i day" +%Y%m%d)
        rm "alfred_"$past_date"_*" #Delete six older files so it deletes up to last monday
    done
fi

if [ $day_num -eq 1 ]
then
    for (( h = 2; h <= 31; h ++))
    do
        first_day=$(date +%Y%m%d)
        past_month=$(date -d "-1 month" +%Y%m$h) 
        if [ $past_month -ne $sunday ]
        then
            rm "alfred_"$past_month"_*" #Delete all last month but keep sundays' backup and the first day of that month
        fi
    done
fi

Para o ano, mantenha apenas o primeiro registro de janeiro

    
por 12.09.2014 / 02:49

Tags