Скрипт Ubuntu bash для удаления старых файлов резервных копий из нескольких каталогов

Это структура моей резервной копии:

  • Резервные копии хранятся в каталоге с именем 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 проблемы, высоко ценятся.


person Ash    schedule 12.09.2017    source источник
comment
Что-нибудь модифицирует их после создания? find . -type f -name "db*" -mtime +1 -delete ?   -  person arco444    schedule 12.09.2017
comment
Нет, но есть 5-6 дБ, поэтому я использую *, чтобы включить их все   -  person Ash    schedule 12.09.2017
comment
Итак, я могу использовать -mtime для моей второй проблемы. Любое решение для 1-го? Я хочу проверять последнюю БД каждый день и удалять все оставшиеся резервные копии.   -  person Ash    schedule 12.09.2017
comment
Я думаю, что это будет сложно без написания сценария для этого. Возможно, используя некоторые хитрости с -exec в вашей команде поиска, но это станет трудно читать   -  person arco444    schedule 12.09.2017


Ответы (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<=N<=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
person Renaud Pacalet    schedule 12.09.2017