Linux

bash 旋轉腳本

  • September 16, 2021

我的目錄結構如下:

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 語句更改或擴展到最後以執行實際刪除。

引用自:https://unix.stackexchange.com/questions/424376