这是我备份的结构:
- 备份存储在名为
cron_hourly_backup
的目录中 - 在该目录中,每天创建一个用
ddmmyyyy
格式命名的目录。 - 在这些目录中的每个目录中,每小时都有5-6 dB的备份,每小时都会通过cron-job倾倒,每个小时的备份文件都使用时间戳具有唯一的名称(例如:ex:
db1_000000.zip .... db5_000000.zip
todb1_230000.zip ... db5_230000.zip
)
现在,我想通过编程方式删除超过1天的所有备份文件(或保留今天和昨天的备份),但每天保留一个最新的DB(全部5 dbs)。我该如何实现?
目前我正在这样做:
find . -type f ( -name "*_00*"
-o -name "*_01*"-o -name "*_02*"
-o -name "*_03*" -o -name "*_04*"
-o -name "*_05*" -o -name "*_06*"
-o -name "*_07*" -o -name "*_08*"
-o -name "*_09*" -o -name "*_10*"
-o -name "*_11*" -o -name "*_12*"
-o -name "*_13*" -o -name "*_14*"
-o -name "*_14*" -o -name "*_15*"
-o -name "*_16*" -o -name "*_17*"
-o -name "*_18*" -o -name "*_19*"
-o -name "*_20*" -o -name "*_21*"
-o -name "*_22*" ) -delete
这很好,问题是
- 如果一天没有23小时的备份,那么我将失去当天的所有文件。
- 它也将删除今天和昨天的备份。
关于如何解决上述两个问题的任何建议都非常感谢。
不确定什么,但每天保留一个最新的db(所有5 dbs)的意思是。如果它的意思是"每天仅保留最后一个(按词典顺序)文件",并且如果您拥有coreutils
date
UTISITY,则类似的bash脚本可以起作用(未测试):
#/usr/bin/env bash
declare -a l # array of backup files
bd=cron_hourly_backup # backup dir
td=$( date +"%d%m%Y" ) # today
yd=$( date -d yesterday +"%d%m%Y" ) # yesterday
for n in "$bd"/*; do
if [ ! -d "$n" ]; then
continue # skip if not a directory
fi
if [[ "$n" == "$bd/$td" || "$n" == "$bd/$yd" ]]; then
continue # skip if today or yesterday
fi
l=( $( ls "$n" ) ) # populate array
# loop over all backup files except the last one
for (( i = 0; i < ${#l[@]} - 1; i += 1 )); do
echo "rm -f $n/${l[i]}" # comment when OK
# rm -f "$n/${l[i]}" # uncomment when OK
done
done
如果要使用1<=N<=6
保留每个dbN_*
的最后一个,则可以使用一个循环级别(未测试):
#/usr/bin/env bash
declare -a l # array of backup files
bd=cron_hourly_backup # backup dir
td=$( date +"%d%m%Y" ) # today
yd=$( date -d yesterday +"%d%m%Y" ) # yesterday
for n in "$bd"/*; do
if [ ! -d "$n" ]; then
continue # skip if not a directory
fi
if [[ "$n" == "$bd/$td" || "$n" == "$bd/$yd" ]]; then
continue # skip if today or yesterday
fi
for (( j = 1; j <= 6; j += 1 )); do
l=( $( ls "$n/db${j}_"* ) ) # populate array
# loop over all backup files except the last one
for (( i = 0; i < ${#l[@]} - 1; i += 1 )); do
echo "rm -f ${l[i]}" # comment when OK
# rm -f "${l[i]}" # uncomment when OK
done
done
done