Linux bash备份脚本 - 12,9,6,3,1个月

时间:2015-10-29 14:45:38

标签: linux bash cron

我正在编写一个bash备份脚本,到目前为止它的工作非常出色。问题是它很快就弄乱了我的硬盘。

备份每周运行一次。

我想:

  • 保存最近的4个备份
  • 保存3个月的备份
  • 保存6个月的备份
  • 保存12的备份 几个月

现在我该如何实现这一目标? 我想我可以弄清楚如何“检查文件是否存在”,但我无法理解如何删除正确的备份。

备用3个月,下周将是3个月和1周 - 因此被删除.. 有没有任何天真的简单方法来解决这个问题,我可能忽略了......?

提前致谢,

3 个答案:

答案 0 :(得分:0)

我有一个类似的任务,删除文件到目前为止我必须做的是:

1. generate an interval date from todays date (like 3 months ago)
   [this post has a good writeup about getting specific dates
   http://stackoverflow.com/questions/11144408/convert-string-to-date-in-bash]

2. loop over all the files in the location and get their time\date stamp with
   date -r <filename> +%Y
   date -r <filename> +%m
   date -r <filename> +%d

3. Compare file date to interval date from todays date and keep if it matches or delete if not.

希望这可以帮助你实现这个概念

答案 1 :(得分:0)

假设您根据日期命名了备份:

% date +%Y-%m-%d
2015-10-29

然后你可以像这样计算一年前的日期:

% date +%Y-%m-%d -d "-1 year"
2014-10-29

和5周前的日期是这样的:

% date +%Y-%m-%d -d "-5 weeks"
2015-09-24

所以你可以设置每3个月和每个星期天运行的cronjobs, 并删除一年前和5周前发生的备份,如下所示:

# Every 3 months, run the backup script
1  2    *    */3   *    /path/to/backup/script.sh > /path/to/backupdir/$(date +%Y-%m-%d-Q)

# Every 3 months, delete the backup made on that date the previous year
1  2    *    */3   *    /bin/rm /path/to/backupdir/$(date +%Y-%m-%d-Q -d "-1 year")

# Every Sunday, if backup does not exist, run backup script
1  3    *    *   7    if [ ! -f /path/to/backupdir/$(date +%Y-%m-%d-Q) ]; then /path/to/backup/script.sh > /path/to/backupdir/$(date +%Y-%m-%d) fi

# Every Sunday, delete backup 5 weeks old
1  3    *    *     7   /bin/rm /path/to/backupdir/$(date +%Y-%m-%d -d "-5 weeks")

请注意

  • 我们要注意不要在同一天运行备份脚本两次 例如,当一个季度备份发生在星期天。如果是季度备份 cronjob设置为运行(凌晨2:00),之前每周备份(凌晨3:00),然后 我们可以阻止每周备份运行by testing if the backup filename already exists。这是使用

    的目的
    [ ! -f /path/to/backupdir/$(date +%Y-%m-%d-Q) ]
    
  • 当我们删除5周的备份时,我们不想删除季度备份。 我们可以通过将季度备份命名与每周备份略有不同来防止这种情况发生,例如使用Q

    % date +%Y-%m-%d-Q
    2015-10-29-Q
    

    以便删除每周备份的命令,

    /bin/rm /path/to/backupdir/$(date +%Y-%m-%d -d "-5 weeks")
    

    不会删除季度备份。

答案 2 :(得分:0)

如果您为备份文件提供了一个很好的命名方案,例如:10.29.15-BACKUP.zip,您可以轻松地实现它。最简单的地方,您可以拥有2个单独的文件夹,一个用于每日备份,一个用于档案。

所以在你的bash脚本中:

#BACKUP PROCESS HAPPENS HERE, PLACES BACKUP NAMED 10.29.15-BACKUP.zip in /home/User/DailyBackups FOLDER, WHICH WE WILL CALL $CurrentBackup

#Get Date from 3 months ago
ChkDate=`date --date="-3 months" +%m.%d.%y`

#See if this file exists
ls $ChkDate-BACKUP.zip /home/User/BackupArchive/

#If it does exist then copy current backup to BackupArchive Folder and Remove any backups older than 367 days from the BackupArchive Folder
if [[ $? == 0 ]]; then
    cp /home/User/DailyBackups/$CurrentBackup /home/User/BackupArchive/$CurrentBackup
    find /home/User/BackupArchive/*-BACKUP.zip -mtime +367 -exec rm {} \
fi

#Remove all but the most recent 4 Backups
for i in `ls -t /home/User/DailyBackups/*-BACKUP.zip | tail -n +5`; do
    rm "$i"
done

我用367来计算366天的闰年,以防你的一年备份有点过时,比如366天和1分钟。