bash轮换脚本

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 天之前的所有内容。

答案1

我一直无法找到一个简单的解决方案。我发现解决这个问题的最简单方法是使用“保留”列表而不是“删除”列表。然后我可以将最后 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 语句以执行实际的删除。

答案2

这又是怎么回事?

for i in $(find . -maxdepth 1); do 
    if ! (( $((($(date +%s) - $(date +%s -r $i )) / 86400)) % 7)); then 
        echo $i # Print out the folder. Can be replaced with your action
    fi
done

或作为单行:

for i in $(find . -maxdepth 1); do if ! (( $((($(date +%s) - $(date +%s -r $i )) / 86400)) % 7)); then echo "$i $i_weekly" ;fi; done

这应该只打印 7、14、21、28...天前的所有文件夹。而不是“回声”只是制作一个MV或其他什么......

答案3

backup-*-*-01以下是轮换备份但保留最近 7 天、12 个月和 10 年的示例脚本backup-*-01-01

all=$(ls backup-*)
days=$(ls backup-* | tail -n 7)
monthes=$(ls backup-*-01 | tail -n 12)
years=$(ls backup-*-01-01 | tail -n 10)
keep=" $days $monthes $years "

for item in $all
do
    if ! [[ "$keep" =~ "$item" ]]
    then
        echo "$item will be deleted"
        # rm $item
    fi
done

相关内容