Flo*_*rei 19 linux backup bash
我需要每天备份此服务器上的数据和配置文件。我需要保持:
所有这些都是通过每天从 cron 运行的 shell 脚本完成的。
这是备份文件在运行 10 年后的样子:
blog-20050103.tar.bz2
blog-20060102.tar.bz2
blog-20070101.tar.bz2
blog-20080107.tar.bz2
blog-20090105.tar.bz2
blog-20100104.tar.bz2
blog-20110103.tar.bz2
blog-20120102.tar.bz2
blog-20130107.tar.bz2
blog-20130902.tar.bz2
blog-20131007.tar.bz2
blog-20131104.tar.bz2
blog-20131202.tar.bz2
blog-20140106.tar.bz2
blog-20140203.tar.bz2
blog-20140303.tar.bz2
blog-20140407.tar.bz2
blog-20140505.tar.bz2
blog-20140602.tar.bz2
blog-20140707.tar.bz2
blog-20140728.tar.bz2
blog-20140804.tar.bz2
blog-20140811.tar.bz2
blog-20140816.tar.bz2
blog-20140817.tar.bz2
blog-20140818.tar.bz2
blog-20140819.tar.bz2
blog-20140820.tar.bz2
blog-20140821.tar.bz2
blog-20140822.tar.bz2
Run Code Online (Sandbox Code Playgroud)
Mik*_*eyB 31
你严重过度设计了这个。糟糕。
这是一些伪代码:
daily目录daily备份之外的所有内容weekly目录weekly备份之外的所有内容monthly目录monthly备份之外的所有内容yearly目录您必须实现的逻辑量大致相同,是吗?吻。
这看起来更容易:
s3cmd ls s3://backup-bucket/daily/ | \
awk '$1 < "'$(date +%F -d '1 week ago')'" {print $4;}' | \
xargs --no-run-if-empty s3cmd del
Run Code Online (Sandbox Code Playgroud)
或者,按文件计数而不是年龄:
s3cmd ls s3://backup-bucket/daily/ | \
awk '$1 != "DIR"' | \
sort -r | \
awk 'NR > 7 {print $4;}' | \
xargs --no-run-if-empty s3cmd del
Run Code Online (Sandbox Code Playgroud)
例如,如果您只想保留 8 个每日备份和 5 个每周(每个星期日)备份,则其工作方式如下:
for i in {0..7}; do ((keep[$(date +%Y%m%d -d "-$i day")]++)); done
for i in {0..4}; do ((keep[$(date +%Y%m%d -d "sunday-$((i+1)) week")]++)); done
echo ${!keep[@]}
Run Code Online (Sandbox Code Playgroud)
截至今天(2014-11-10),这将输出:
20141012 20141019 20141026 20141102 20141103 20141104
20141105 20141106 20141107 20141108 20141109 20141110
Run Code Online (Sandbox Code Playgroud)
作为留给您的练习,您只需删除名称未出现在keep-array中的所有备份文件。
如果您还想保留 13 个每月备份(每个月的第一个星期日)和 6 个年度备份(每年的第一个星期日),事情会变得有点复杂:
for i in {0..7}; do ((keep[$(date +%Y%m%d -d "-$i day")]++)); done
for i in {0..4}; do ((keep[$(date +%Y%m%d -d "sunday-$((i+1)) week")]++)); done
for i in {0..12}; do
DW=$(($(date +%-W)-$(date -d $(date -d "$(date +%Y-%m-15) -$i month" +%Y-%m-01) +%-W)))
for (( AY=$(date -d "$(date +%Y-%m-15) -$i month" +%Y); AY < $(date +%Y); AY++ )); do
((DW+=$(date -d $AY-12-31 +%W)))
done
((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++))
done
for i in {0..5}; do
DW=$(date +%-W)
for (( AY=$(($(date +%Y)-i)); AY < $(date +%Y); AY++ )); do
((DW+=$(date -d $AY-12-31 +%W)))
done
((keep[$(date +%Y%m%d -d "sunday-$DW weeks")]++))
done
echo ${!keep[@]}
Run Code Online (Sandbox Code Playgroud)
截至今天(2014-11-10),这将输出:
20090104 20100103 20110102 20120101 20130106 20131103
20131201 20140105 20140202 20140302 20140406 20140504
20140601 20140706 20140803 20140907 20141005 20141012
20141019 20141026 20141102 20141103 20141104 20141105
20141106 20141107 20141108 20141109 20141110
Run Code Online (Sandbox Code Playgroud)
同上,只需删除此数组中未找到的所有备份文件。