GNU/Linux >> Belajar Linux >  >> Linux

Cara menyimpan:backup harian selama seminggu, mingguan selama sebulan, bulanan selama setahun, dan tahunan setelah itu

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
  • Setiap minggu:
    • buat cadangan, masukkan ke weekly direktori
    • hapus semuanya kecuali 5 weekly terakhir backup
  • Setiap bulan:
    • buat cadangan, masukkan ke monthly direktori
    • hapus semuanya kecuali 12 monthly terakhir backup
  • Setiap tahun:
    • buat cadangan, masukkan ke yearly direktori

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.


Linux
  1. Bagaimana saya bisa mendapatkan tanggal dan waktu saat ini di terminal dan mengatur perintah khusus di terminal untuk itu?

  2. Bagaimana cara mengonversi dari hari ke tahun dan tahun ke tanggal YYYYMMDD?

  3. Cara menentukan jumlah minggu dalam sebulan

  1. Bagaimana saya menggunakan Ansible dan anacron untuk otomatisasi

  2. Cara menggunakan rsync lanjutan untuk cadangan Linux besar

  3. Bagaimana cara menambahkan X hari ke tanggal dan mendapatkan tanggal baru?

  1. Cara Membuat Jadwal Tugas di Ubuntu untuk Pekerjaan Harian / Mingguan / Bulanan

  2. SSHFS? Apa itu dan bagaimana cara menggunakannya?

  3. Bagaimana Cara Mencari File Berdasarkan Ukuran Dan Ekstensi?