我有一些文件夹,里面的文件名称为“example_YY_MM_DD-HH.zip”,我每天有 3 个备份。我需要这个:
1)对于超过 1 周的备份,我每天只需要一次(在 HH 的午夜‘00’)
2)对于超过一个月的备份,我每周只需要一次备份。
3)对于超过一年的备份,我每月只需要一次备份(每月的第一天)
我只有这个,我不知道 IF 部分该放什么。
谢谢
#!/bin/sh
export NOW=$(date +"%d-%m-%Y")
export OUTPUT=/media/backup/logs/delete-old.txt
export BACKUP_DIR=
for file in $BACKUP_DIR
do
if $file
fi
done
答案1
这应该可以工作(如果您设置了正确的完整路径或相对路径,它当前位于目录测试中)
#! /bin/bash
nowday=$(date +"%d")
nowmonth=$(date +"%m")
nowyear=$(date +"%y")
#number of days since 1 Jan 1970 (today)
nowdays=$(($(date --date="20$nowyear-$nowmonth-$nowday" +"%s")/86400))
backup_dir="test/*"
#echo $backup_dir
for file in $backup_dir
do
hour=${file: -6: -4}
day=${file: -9: -7}
month=${file: -12: -10}
year=${file: -15: -13}
#number of days since 1 Jan 1970 (file)
days=$(($(date --date="20$year-$month-$day" +"%s")/86400))
if ((days < nowdays-365)); then
# more than one year
if ((10#$day == 1))&&((10#$hour == 0)); then
#day is 1 hour is 0 (we keep) use this space if you want to copy or something!
:
else
#Wrong day or hour
rm $file
fi
else if ((days < nowdays-31)); then
# more than one month (31 days)
if (((10#$day == 1))||((10#$day == 8))||((10#$day == 15))||((10#$day == 22))||((10#$day == 29)))&&((10#$hour == 0)); then
#day is 1,8,15,22,29 hour is 0 (we keep) use this space if you want to copy or something!
:
else
#Wrong day or hour
rm $file
fi
else if ((days < nowdays-7)); then
# more than one week
if ((10#$hour == 0)); then
#hour is zero se this space if you want to copy or something!
:
else
#Wrong hour
rm $file
fi
else
# less than one week (we keep) use this space if you want to copy or something!
:
fi fi fi
done
我始终将一个月定义为 31 天,以检查是否超过 1 个月。每周一次,我选择 1、8、15、22 和 29 天,因此始终存在该月的第一天。这也适用于后期目录,因为它会检查每个文件的午夜。
这些:
行只是占位符,以防您想在那里放置代码。
在运行所有内容之前先检查一下,以防出现错误!
答案2
看起来这些是实现您所寻找内容的一些方法。