Solusi 1:
Anda benar-benar merekayasa ini secara berlebihan. Buruk.
Berikut ini beberapa kodesemu:
- Setiap hari:
- buat cadangan, masukkan ke
daily
direktori - hapus semuanya kecuali 7
daily
terakhir backup
- buat cadangan, masukkan ke
- Setiap minggu:
- buat cadangan, masukkan ke
weekly
direktori - hapus semuanya kecuali 5
weekly
terakhir backup
- buat cadangan, masukkan ke
- Setiap bulan:
- buat cadangan, masukkan ke
monthly
direktori - hapus semuanya kecuali 12
monthly
terakhir backup
- buat cadangan, masukkan ke
- Setiap tahun:
- buat cadangan, masukkan ke
yearly
direktori
- buat cadangan, masukkan ke
Jumlah logika yang harus Anda terapkan hampir sama, bukan? CIUMAN.
Ini terlihat lebih mudah:
s3cmd ls s3://backup-bucket/daily/ | \
awk '$1 < "'$(date +%F -d '1 week ago')'" {print $4;}' | \
xargs --no-run-if-empty s3cmd del
Atau, berdasarkan jumlah file, bukan usia:
s3cmd ls s3://backup-bucket/daily/ | \
awk '$1 != "DIR"' | \
sort -r | \
awk 'NR > 7 {print $4;}' | \
xargs --no-run-if-empty s3cmd del
Solusi 2:
Jika Anda hanya ingin menyimpan, misalnya, 8 pencadangan harian dan 5 pencadangan mingguan (setiap minggu), cara kerjanya seperti ini:
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[@]}
Mulai hari ini (10-11-2014), ini akan menampilkan:
20141012 20141019 20141026 20141102 20141103 20141104
20141105 20141106 20141107 20141108 20141109 20141110
Sebagai latihan tersisa untuk Anda, Anda hanya perlu menghapus semua file cadangan yang namanya tidak muncul di keep
-array.
Jika Anda juga ingin menyimpan 13 cadangan bulanan (minggu pertama setiap bulan) dan 6 cadangan tahunan (minggu pertama setiap tahun), semuanya menjadi sedikit lebih rumit:
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[@]}
Mulai hari ini (10-11-2014), ini akan menampilkan:
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
Sama seperti di atas, cukup hapus semua file cadangan yang tidak ditemukan di larik ini.