이름과 특정 패턴으로 오래된 백업 파일을 삭제하는 쉘/Bash 스크립트

이름과 특정 패턴으로 오래된 백업 파일을 삭제하는 쉘/Bash 스크립트

각 데이터베이스에 대한 백업 파일을 생성합니다. 파일 이름은 다음과 같습니다.

prod20210528_1200.sql.gz 
pattern: prod`date +\%Y%m%d_%H%M`

필요한 경우 패턴을 조정할 수 있습니다.

나는 스크립트를 원한다:

  • 지난 x(예: 3)일 동안의 모든 백업을 보관합니다.
  • x(예: 3)일보다 오래된 백업의 경우 00:00부터 시작하는 백업만 보존해야 합니다.
  • y(예: 14)일보다 오래된 백업의 경우 매주(월요일) 하나의 파일만 보관합니다.
  • z일(예: 90)보다 오래된 백업의 경우 한 달에 한 개의 파일만 보관합니다(매월 1일).
  • 가능하다면 스크립트는 파일의 날짜(생성) 정보보다는 파일 이름을 사용해야 합니다.
  • 이 스크립트는 매일 실행되어야 합니다.

불행하게도 나는 쉘/배시 스크립트 언어에 대해 아는 바가 거의 없습니다. 나는 다음과 같이 할 것입니다 :

if (file < today - x AND date > today - (x + 1))
{
  if (%H_of_file != 00 AND %M_of_file != 00)
  {  
    delete file
  }
}

if (file < today - y AND date > today - (y + 1))
{
  if (file != Monday)
  {  
    delete file
  }
}

if (file < today - z AND date > today - (z + 1))
{
  if (%m_of_file != 01)
  {  
    delete file
  }
}

Does this makes any sense for you?

Thank you very much! 

All the best,
Phantom


답변1

커미터로서pyExpireBackups내 솔루션의 ExpirationRule 구현을 알려드릴 수 있습니다(소스는 아래 및 github 저장소에 있음).

바라보다https://wiki.bitplan.com/index.php/PyExpireBackups도쿠를 위해.

설치 스크립트:

pip install PyExpireBackups

쉘 명령 "expireBackups"가 설치됩니다. 사용법은 다음과 같습니다:

expireBackups -h
usage: expireBackups [-h] [-d] [--days DAYS] [--weeks WEEKS] [--months MONTHS] [--years YEARS]
                     [--minFileSize MINFILESIZE] [--rootPath ROOTPATH] [--baseName BASENAME] [--ext EXT]
                     [--createTestFiles CREATETESTFILES] [-f] [-V]

Backup expiration based on rules (yearly,monthly,weekly,daily ...)

  Created by Wolfgang Fahl on 2022-04-01.
  Copyright 2008-2022 Wolfgang Fahl. All rights reserved.

  Licensed under the Apache License 2.0
  http://www.apache.org/licenses/LICENSE-2.0

  Distributed on an "AS IS" basis without warranties
  or conditions of any kind, either express or implied.

USAGE

optional arguments:
  -h, --help            show this help message and exit
  -d, --debug           show debug info
  --days DAYS           number of consecutive days to keep a daily backup (default: 7)
  --weeks WEEKS         number of consecutive weeks to keep a weekly backup (default: 6)
  --months MONTHS       number of consecutive month to keep a monthly backup (default: 8)
  --years YEARS         number of consecutive years to keep a yearly backup (default: 4)
  --minFileSize MINFILESIZE
                        minimum File size in bytes to filter for (default: 1)
  --rootPath ROOTPATH
  --baseName BASENAME   the basename to filter for (default: None)
  --ext EXT             the extension to filter for (default: None)
  --createTestFiles CREATETESTFILES
                        create the given number of temporary test files (default: None)
  -f, --force
  -V, --version         show program's version number and exit

예제를 실행하면 다음과 같은 결과가 나타납니다.

expireBackups --ext .tgz
keeping 7 files for dayly backup
keeping 6 files for weekly backup
keeping 8 files for monthly backup
keeping 4 files for yearly backup
expiring 269 files dry run
#   1✅:   0.0 days(    5 GB/    5 GB)→./sql_backup.2022-04-02.tgz
#   2✅:   3.0 days(    5 GB/    9 GB)→./sql_backup.2022-03-30.tgz
#   3✅:   4.0 days(    5 GB/   14 GB)→./sql_backup.2022-03-29.tgz
#   4✅:   5.0 days(    5 GB/   18 GB)→./sql_backup.2022-03-28.tgz
#   5✅:   7.0 days(    5 GB/   23 GB)→./sql_backup.2022-03-26.tgz
#   6✅:   9.0 days(    5 GB/   27 GB)→./sql_backup.2022-03-24.tgz
#   7✅:  11.0 days(    5 GB/   32 GB)→./sql_backup.2022-03-22.tgz
#   8❌:  15.0 days(    5 GB/   37 GB)→./sql_backup.2022-03-18.tgz
#   9❌:  17.0 days(    5 GB/   41 GB)→./sql_backup.2022-03-16.tgz
#  10✅:  18.0 days(    5 GB/   46 GB)→./sql_backup.2022-03-15.tgz
#  11❌:  19.0 days(    5 GB/   50 GB)→./sql_backup.2022-03-14.tgz
#  12❌:  20.0 days(    5 GB/   55 GB)→./sql_backup.2022-03-13.tgz
#  13❌:  22.0 days(    5 GB/   59 GB)→./sql_backup.2022-03-11.tgz
#  14❌:  23.0 days(    5 GB/   64 GB)→./sql_backup.2022-03-10.tgz
#  15✅:  35.0 days(    4 GB/   68 GB)→./sql_backup.2022-02-26.tgz
#  16❌:  37.0 days(    4 GB/   73 GB)→./sql_backup.2022-02-24.tgz
#  17❌:  39.0 days(    4 GB/   77 GB)→./sql_backup.2022-02-22.tgz
#  18❌:  40.0 days(    5 GB/   82 GB)→./sql_backup.2022-02-21.tgz
#  19✅:  43.0 days(    4 GB/   86 GB)→./sql_backup.2022-02-18.tgz
...
...
# 264✅:1426.0 days(    4 GB/    1 TB)→./sql_backup.2018-05-07.tgz
# 265❌:1433.0 days(    4 GB/    1 TB)→./sql_backup.2018-04-30.tgz
# 266❌:1447.0 days(    4 GB/    1 TB)→./sql_backup.2018-04-16.tgz
# 267❌:1482.0 days(    4 GB/    1 TB)→./sql_backup.2018-03-12.tgz
# 268❌:1489.0 days(    4 GB/    1 TB)→./sql_backup.2018-03-05.tgz
# 269❌:1509.0 days(    4 GB/    1 TB)→./sql_backup.2018-02-12.tgz
kept 24 files   105 GB

답변2

이것은 나에게 효과적입니다 (GNU 날짜가 아닌 BSD 날짜)

#!/usr/local/bin/bash
DIR_BACKUPS='/backups'
KEEP_DAILY=3
KEEP_WEEKLY=14
KEEP_MONTHLY=90

date_keep_daily=$(date -j -v-${KEEP_DAILY}d +"%Y%m%d")
date_keep_weekly=$(date -j -v-${KEEP_WEEKLY}d +"%Y%m%d")
date_keep_monthly=$(date -j -v-${KEEP_MONTHLY}d +"%Y%m%d")

for file in $DIR_BACKUPS/prod*.sql.gz; do
    timestamp=${file#*onwalt}
    timestamp=${timestamp%%.*}
    date_of_file=${timestamp%%_*}
    hour_of_file=${timestamp:(-4):2}
    
    if [[ $date_of_file < $date_keep_monthly ]]; then
        if [[ $(date -jf "%Y%m%d_%H%M" $timestamp +"%d") != 01 ]]; then
            rm $file
        fi
    elif [[ $date_of_file < $date_keep_weekly ]]; then
        if [[ $(date -jf "%Y%m%d_%H%M" $timestamp +"%u") != 1 ]]; then
            rm $file
        fi
    elif [[ $date_of_file < $date_keep_daily ]]; then
        if [[ $(date -jf "%Y%m%d_%H%M" $timestamp +"%H") != 00 ]]; then
            rm $file
        fi
    fi
done

관련 정보