GNU/Linux >> Linux の 問題 >  >> Linux

保管方法:1 週間は毎日、1 か月は毎週、1 年間は毎月、その後は毎年のバックアップ

解決策 1:

あなたはこれを真剣に過剰に設計しています。ひどい。

擬似コードは次のとおりです:

  • 毎日:
    • バックアップを作成し、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

または、経過時間ではなくファイル数で:

s3cmd ls s3://backup-bucket/daily/ | \
    awk '$1 != "DIR"' | \
    sort -r | \
    awk 'NR > 7 {print $4;}' | \
    xargs --no-run-if-empty s3cmd del

解決策 2:

たとえば、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[@]}

今日 (2014 年 11 月 10 日) の時点で、これは次のように出力されます:

20141012 20141019 20141026 20141102 20141103 20141104
20141105 20141106 20141107 20141108 20141109 20141110

残されている演習として、名前が keep に表示されないすべてのバックアップ ファイルを削除する必要があります。 -配列。

13 回の月次バックアップ (毎月第 1 日曜日) と 6 回の年次バックアップ (毎年第 1 日曜日) を保持したい場合、状況は少し複雑になります:

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[@]}

今日 (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

上記と同じように、この配列で見つからないすべてのバックアップ ファイルを削除します。


Linux
  1. ターミナルで現在の日付と時刻を取得し、ターミナルでカスタム コマンドを設定するにはどうすればよいですか?

  2. 年と年の日から日付YYYYMMDDに変換する方法は?

  3. Linux で現在の日付と時刻の名前のファイルを作成する方法

  1. 大規模なLinuxバックアップに高度なrsyncを使用する方法

  2. 月の週数を決定する方法

  3. 日付に X 日を追加して新しい日付を取得するにはどうすればよいですか?

  1. 自動化のためにAnsibleとanacronを使用する方法

  2. 毎日/毎週/毎月の仕事のためにUbuntuでスケジュールタスクを作成する方法

  3. サイズと拡張子でファイルを検索する方法は?