删除旧文件,但每周/每月/每年保留一个

删除旧文件,但每周/每月/每年保留一个

我有一个文件夹,每 10 分钟就有一个日志文件:

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
...

我该如何实现这一目标?

  • 删除所有超过一周的文件,但每周保留一个
  • 删除所有超过一个月的文件,但每月保留一个
  • 删除所有超过一年的文件,但每年保留一个

所以我想要过去四个星期的一个文件(4 个文件)每月一个文件(12 个文件)和每年一个文件(rsnapshot与排序备份的系统相同)。

答案1

你想要日志旋转http://linuxcommand.org/man_pages/logrotate8.html

它可能已经在您的系统上。您只需要配置它。然而它的主要目的是清除旧的日志文件,我不知道你是否可以将其配置为保留一个文件。

你可以做什么

创建几个目录log, log.weekly, log.monthly, 和log.yearly

log所有日志文件所在的位置。创造

  • 每周 cron 作业,将最新日志文件从log复制到log.weekly
  • 每月 cron 作业,将最新日志文件从log复制到log.monthly,以及
  • 每年一次的 cron 作业,将最新的日志文件从 复制loglog.yearly

然后为不同的目录适当配置 logrotate。

    #!/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

答案2

好的,假设每天都会创建日志,我会这样做:

#!/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

全年仅保留一月第一个日志

相关内容