Linux bash 备份脚本 - 12、9、6、3、1 个月
Linux bash backup script - 12, 9, 6, 3, 1 months
我正在编写一个 bash 备份脚本,到目前为止它运行良好。问题是它很快就会把我的硬盘搞得一团糟。
备份每周在星期日运行。
我愿意:
- 保存最近的 4 个备份
- 保存 3 个月前的备份
- 保存 6 个月前的备份
- 保存12的备份
月龄
现在我该如何实现呢?
我想我可以弄清楚如何 "check if file exists",但我无法理解如何删除正确的备份。
3 个月前的备份,下周将是 3 个月零 1 周 - 因此将被删除..
有没有任何我可能忽略的非常简单的方法来解决这个问题..?
提前致谢,
我有一个类似的任务来删除最新的文件,我必须做的是:
1. generate an interval date from todays date (like 3 months ago)
[this post has a good writeup about getting specific dates
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.
希望这能帮助你理解这个概念
假设您根据日期命名备份:
% 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:00AM),在 每周备份之前 (在 3:00AM),然后
我们可以通过测试备份文件名
已经存在。这就是使用
的目的
[ ! -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")
不会删除季度备份。
如果你给你的备份文件一个很好的命名方案,比如: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 分钟。
我正在编写一个 bash 备份脚本,到目前为止它运行良好。问题是它很快就会把我的硬盘搞得一团糟。
备份每周在星期日运行。
我愿意:
- 保存最近的 4 个备份
- 保存 3 个月前的备份
- 保存 6 个月前的备份
- 保存12的备份 月龄
现在我该如何实现呢? 我想我可以弄清楚如何 "check if file exists",但我无法理解如何删除正确的备份。
3 个月前的备份,下周将是 3 个月零 1 周 - 因此将被删除.. 有没有任何我可能忽略的非常简单的方法来解决这个问题..?
提前致谢,
我有一个类似的任务来删除最新的文件,我必须做的是:
1. generate an interval date from todays date (like 3 months ago)
[this post has a good writeup about getting specific dates
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.
希望这能帮助你理解这个概念
假设您根据日期命名备份:
% 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:00AM),在 每周备份之前 (在 3:00AM),然后 我们可以通过测试备份文件名 已经存在。这就是使用
的目的[ ! -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")
不会删除季度备份。
如果你给你的备份文件一个很好的命名方案,比如: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 分钟。