【问题标题】:Ubuntu bash script to delete old backup files from multiple directories用于从多个目录中删除旧备份文件的 Ubuntu bash 脚本
【发布时间】:2017-09-13 14:04:35
【问题描述】:

这是我备份的结构:

  • 备份存储到名为cron_hourly_backup 的目录中
  • 在该目录中,每天都会创建一个目录,以ddmmyyyy 格式命名。
  • 在每个目录中都有 5-6 个数据库备份,每小时通过 cron 作业转储,并且每小时的备份文件通过使用时间戳具有唯一的名称(例如:db1_000000.zip .... db5_000000.zip 到 db1_230000.zip ... db5_230000.zip)

现在我想以编程方式删除所有早于 1 天的备份文件(或者,保留今天和昨天的所有备份),但每天保留一个最新的数据库(所有 5 个数据库)。我怎样才能做到这一点?

目前我正在这样做:

find . -type f \( -name "*_00*" \
-o -name "*_01*"-o -name "*_02*" \
-o -name "*_03*" -o -name "*_04*" \
-o -name "*_05*" -o -name "*_06*" \
-o -name "*_07*" -o -name "*_08*" \
-o -name "*_09*" -o -name "*_10*" \
-o -name "*_11*" -o -name "*_12*" \
-o -name "*_13*" -o -name "*_14*" \
-o -name "*_14*" -o -name "*_15*" \
-o -name "*_16*" -o -name "*_17*" \
-o -name "*_18*" -o -name "*_19*" \
-o -name "*_20*" -o -name "*_21*" \
-o -name "*_22*"  \) -delete

这很好用,问题是

  1. 如果任何一天都没有 23 小时备份,那么我将丢失当天的所有文件。
  2. 它还会删除今天和昨天的备份。

非常感谢任何有关如何解决上述 2 个问题的建议。

【问题讨论】:

  • 创建后有什么修改它们的吗? find . -type f -name "db*" -mtime +1 -delete ?
  • 不,但是有 5-6 分贝,所以我使用 * 将它们全部包含在内
  • 好的,所以我可以使用 -mtime 来解决我的第二个问题。 1st有什么解决办法吗?我想检查每天最新的数据库,并删除所有剩余的备份。
  • 我认为如果不编写脚本来做到这一点,这将很棘手。在你的 find 命令中使用带有-exec 的技巧可能会变得难以阅读

标签: bash ubuntu backup-strategies


【解决方案1】:

不确定“但每天保留一个最新的数据库(所有 5 个数据库)”是什么意思。如果这意味着“每天只保留最后一个(按字典顺序)文件”,并且如果您有 coreutils date 实用程序,那么这样的 bash 脚本可以工作(未经测试) :

#/usr/bin/env bash

declare -a l                         # array of backup files
bd=cron_hourly_backup                # backup dir
td=$( date +"%d%m%Y" )               # today
yd=$( date -d yesterday +"%d%m%Y" )  # yesterday
for n in "$bd"/*; do
    if [ ! -d "$n" ]; then
        continue # skip if not a directory
    fi
    if [[ "$n" == "$bd/$td" || "$n" == "$bd/$yd" ]]; then
        continue # skip if today or yesterday
    fi
    l=( $( ls "$n" ) ) # populate array
    # loop over all backup files except the last one
    for (( i = 0; i < ${#l[@]} - 1; i += 1 )); do
        echo "rm -f $n/${l[i]}" # comment when OK
#       rm -f "$n/${l[i]}"      # uncomment when OK
    done
done

如果您想将每个dbN_* 中的最后一个与1&lt;=N&lt;=6 保持一致,那么您可以再使用一个循环级别(未测试):

#/usr/bin/env bash

declare -a l                         # array of backup files
bd=cron_hourly_backup                # backup dir
td=$( date +"%d%m%Y" )               # today
yd=$( date -d yesterday +"%d%m%Y" )  # yesterday
for n in "$bd"/*; do
    if [ ! -d "$n" ]; then
        continue # skip if not a directory
    fi
    if [[ "$n" == "$bd/$td" || "$n" == "$bd/$yd" ]]; then
        continue # skip if today or yesterday
    fi
    for (( j = 1; j <= 6; j += 1 )); do
        l=( $( ls "$n/db${j}_"* ) ) # populate array
        # loop over all backup files except the last one
        for (( i = 0; i < ${#l[@]} - 1; i += 1 )); do
            echo "rm -f ${l[i]}" # comment when OK
#           rm -f "${l[i]}"      # uncomment when OK
        done
    done
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2021-01-17
    • 2021-01-22
    • 2015-12-03
    相关资源
    最近更新 更多