Linux
bash 旋轉腳本
我的目錄結構如下:
backup-2018-01-12 backup-2018-01-13 backup-2018-01-14 backup-2018-01-15 backup-2018-01-16 backup-2018-01-17 backup-2018-01-18 backup-2018-01-19 backup-2018-01-20 backup-2018-01-21 backup-2018-01-22 backup-2018-01-23 backup-2018-01-24 backup-2018-01-25 backup-2018-01-26 backup-2018-01-27 backup-2018-01-28 backup-2018-01-29 backup-2018-01-30 backup-2018-01-31 backup-2018-02-01 backup-2018-02-02 backup-2018-02-03 backup-2018-02-04 backup-2018-02-05 backup-2018-02-06 backup-2018-02-07 backup-2018-02-08 backup-2018-02-09 backup-2018-02-10 backup-2018-02-11 backup-2018-02-12 backup-2018-02-13 backup-2018-02-14 backup-2018-02-15
如何使用腳本將最近 7 天和每週的最後一次備份保存 4 週
例如
所以我保持
backup-2018-01-25 <-- this is 3 waeks from now and so on. backup-2018-02-02 <-- this is 2 weeks earlier from now backup-2018-02-09 backup-2018-02-10 backup-2018-02-11 backup-2018-02-12 backup-2018-02-13 backup-2018-02-14 backup-2018-02-15
所以我嘗試了
find -type d -name 'backup-*' -mtime +7 -exec rm -v {} \;
這確實保留了最新的 7,但刪除了超過 7 天的所有內容。
我一直無法找到一個簡單的解決方案。我發現解決它的最簡單方法是使用“保留”列表而不是“刪除”列表。然後我可以將最後 N 個備份添加到列表中,以及 M 週內每週範圍內的最新備份。(在我自己的程式碼中,前段時間編寫的,我將其擴展到月、季和年。)顯然會有一些重疊,但因為它是一個“保留”列表,這並不重要。然後您刪除列表中沒有的所有內容 - 首先檢查列表是否為空。
#!/bin/bash # dirs=( backup-2018-01-12 backup-2018-01-13 backup-2018-01-14 backup-2018-01-15 backup-2018-01-16 backup-2018-01-17 backup-2018-01-18 backup-2018-01-19 backup-2018-01-20 backup-2018-01-21 backup-2018-01-22 backup-2018-01-23 backup-2018-01-24 backup-2018-01-25 backup-2018-01-26 backup-2018-01-27 backup-2018-01-28 backup-2018-01-29 backup-2018-01-30 backup-2018-01-31 backup-2018-02-01 backup-2018-02-02 backup-2018-02-03 backup-2018-02-04 backup-2018-02-05 backup-2018-02-06 backup-2018-02-07 backup-2018-02-08 backup-2018-02-09 backup-2018-02-10 backup-2018-02-11 backup-2018-02-12 backup-2018-02-13 backup-2018-02-14 backup-2018-02-15 ) declare -A list declare -A keep #################################################################################### # Go # prefix="backup-" today=$(date +%Y-%m-%d) # Populate list from set of directories # for item in "${dirs[@]}" do list[$item]="$item" done # Build keep list from business criteria # for dayback in {0..6} do dateback=$(date --date "$today - $dayback day" +%Y-%m-%d) keep[$prefix$dateback]=1 done for weekback in {0..3} do dateback1=$(date --date "$today - $weekback week" +%Y-%m-%d) dateback2=$(date --date "$today - $((weekback + 1)) week" +%Y-%m-%d) # Look for newest in range # newest= dateback="$dateback1" while [[ $dateback != $dateback2 ]] do [[ -n ${list[$prefix$dateback]} ]] && newest=$dateback && break dateback=$(date --date "$dateback - 1 day" +%Y-%m-%d) done [[ -n $newest ]] && keep[$prefix$newest]=1 done # We now have a keep list, so delete anything not in that list # for item in "${list[@]}" do [[ -n ${keep[$item]} ]] && echo "KEEP $item" || echo "DELETE $item" done # All done # exit 0
當您滿意時,將 echo 語句更改或擴展到最後以執行實際刪除。