如何保留:一周的每日备份,一个月的每周备份,一年的每月备份,以及之后的每年备份

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目录
    • 删除除最后 7 个daily备份之外的所有内容
  • 每周:
    • 进行备份,放入weekly目录
    • 删除除最后 5 个weekly备份之外的所有内容
  • 每个月:
    • 进行备份,放入monthly目录
    • 删除除最后 12 个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)

  • 显然不是。 (5认同)
  • 我不确定你是如何从“我需要每日/每周/每月/每年备份”这个简单问题转变为“你对此进行了严重的过度设计”。 (4认同)

pow*_*pow 8

例如,如果您只想保留 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)

同上,只需删除此数组中未找到的所有备份文件。