Linux定时循环备份指定文件或文件夹,每月永久备份留1份

备份需求:每天完成一次指定文件的备份,压缩后存放到指定目录

问题:备份时间长了以后占用空间较大,浪费存储,实际历史备份意义不大,并不需要永久保存。但是如果直接删除可能导致无法恢复历史状态的数据。

解决思路:
第一步:每天备份时用当天时间的日期的天数命名备份文件,每次备份时覆盖上个月同一天的备份文件,这样每天都有备份,最多留存31份备份,不会无限增加备份浪费空间。

第二步:考虑到历史备份意义不大,但又不能完全删除,所以每个月指定日期(例如每月01号)完成一次永久备份,一年备份量12份,占用较少空间,且可以恢复到N个月以前的状态。

脚本下载:https://download.csdn.net/download/feng_601/88598945

功能:每天定时循环备份指定文件或文件夹,压缩后存放到指定目录,每天循环覆盖上月的备份,最多保留31份,永久备份会单独存放,每月01号永久备份一次

脚本文件名:backup_file.sh(可自定义)

使用方法:sh backup_file.sh [参数1] [参数2] [参数3]
## 参数1:允许空,要备份目标文件或文件夹
## 参数2:允许空,备份后存放位置目录
## 参数3:允许空,默认值是01


#!/bin/bash
## 功能:定时循环备份指定文件或文件夹,压缩后存放到指定目录,每天循环覆盖上月的备份,最多保留31份,永久备份会单独存放,每月01号永久备份一次
## 脚本文件名:backup_file.sh
## 使用方法:sh backup_file.sh [参数1] [参数2] [参数3]
## 参数1:允许空,要备份目标文件或文件夹
## 参数2:允许空,备份后存放位置目录
## 参数3:允许空,默认值是01
##
####################  配置信息(可动态传参,支持默认值)  ##############################
# 需要备份的目标文件、或目标文件夹目录
# 支持默认值,支持传第1个参数
backupfile=${1:-"/data/folder"}  #/data/test.txt
echo 需要备份的目标文件:$backupfile
#
# 配置文件及归档的目标目录。
# 支持默认值,支持传第2个参数
backup_dir=${2:-"/data/backup/mrdocpro"}
# 需要永久固定备份的日期,例如01 表示每月01号完成永久备份(不删除不覆盖)
# 支持默认值,支持传第3个参数
forever_day=${3:-"01"}  #默认值01
##################### 其他默认值配置 #################################################
#
# 备份后压缩包名通过日期区分。
today=$(date +%Y%m%d)
# 获得当天日期:比如01
day=$(date +%d)

#按日备份存放目录
backup_dir_day=$backup_dir/$day
#永久备份存放目录
backup_dir_forever=$backup_dir/forever
#
echo 备份后归档存放路径:$backup_dir_day
#日志文件
logdir=$backup_dir/logs
logfile=$logdir/$0_runlog.log
echo 日志文件:$logfile
#####################################################################################
#
#echo 备份路径:$backup_dir_day
####################  初始化  ##############################################
if [ ! -d "$logdir" ]; then
        echo $(date +%Y-%m-%d-%T) "$logdir" 需要创建日志目录:
        mkdir -p $logdir
        echo $(date +%Y-%m-%d-%T) "$logdir" 日志目录已创建 created >> $logfile
fi
#如果文件夹不存在,创建文件夹
if [ ! -d "$backup_dir_day" ]; then
        mkdir -p $backup_dir_day
        echo $(date +%Y-%m-%d-%T) "$backup_dir_day" 文件夹已创建 created
        echo $(date +%Y-%m-%d-%T) "$backup_dir_day" 文件夹已创建 created >> $logfile
fi
#
#####################################开始备份#######################################
###############每日备份,最多保留31份,一般保留30天的备份文件,循环覆盖#############
#如果备份目标是文件夹
if [ -d "$backupfile" ]; then
        backedfilename=$backup_dir_day/${backupfile##*/}_${day}.tar.gz
        #压缩文件,如果文件名已存在则直接覆盖
        echo $(date +%Y-%m-%d-%T) 备份压缩文件夹目录 $backupfile 到 $backedfilename
        echo $(date +%Y-%m-%d-%T) 备份压缩文件夹目录 $backupfile 到 $backedfilename  >> $logfile
        tar -czf $backedfilename $backupfile 2>/dev/null
#如果备份目标是文件
elif [ -f "$backupfile" ]; then
        backedfilename=$backup_dir_day/${backupfile##*/}_${day}.tar.gz
        echo $(date +%Y-%m-%d-%T) 备份压缩文件 $backupfile 到 $backedfilename
        echo $(date +%Y-%m-%d-%T) 备份压缩文件 $backupfile 到 $backedfilename  >> $logfile
        tar -czf $backedfilename $backupfile 2>/dev/null
else
        echo $(date +%Y-%m-%d-%T) 压缩文件"$backupfile" 不存在或不受支持!!
        echo $(date +%Y-%m-%d-%T) 压缩文件"$backupfile" 不存在或不受支持!! >> $logfile
fi
#压缩文件,如果文件名已存在则直接覆盖
#echo $(date +%Y-%m-%d-%T) 压缩文件 $backupfile 到 $backedfilename
#echo $(date +%Y-%m-%d-%T) 压缩文件 $backupfile 到 $backedfilename  >> $logfile
#tar -czf $backedfilename $backupfile 2>/dev/null
#
###############每月永久备份,永久保留不会被覆盖、不会删除##########################
#如果是每月1号,则额外存放一份
if  [ $day -eq ${forever_day} ] && [ -f "$backedfilename" ]; then
        if  [ ! -d "#$backup_dir_forever" ]; then
                mkdir -p $backup_dir_forever
        fi
        # 完成一次永久备份
        cp $backedfilename ${backup_dir_forever}/${backupfile##*/}_${day}_${today}.tar.gz
        echo $(date +%Y-%m-%d-%T)  完成第一次永久备份copy复制 $backedfilename 到  ${backup_dir_forever}/${backupfile##*/}_${day}_${today}.tar.gz
        echo $(date +%Y-%m-%d-%T)  完成第一次永久备份copy复制 $backedfilename 到  ${backup_dir_forever}/${backupfile##*/}_${day}_${today}.tar.gz  >> $logfile

        #
        backedfilename=$backup_dir_day/${backupfile##*/}_${today}.tar.gz
        echo $(date +%Y-%m-%d-%T) 完成第二次永久备份新建压缩 $backupfile 到 $backedfilename
        echo $(date +%Y-%m-%d-%T) 完成第二次永久备份新建压缩 $backupfile 到 $backedfilename  >> $logfile
        tar -czf $backedfilename $backupfile 2>/dev/null

fi
################################################################################
#删除历史文件(因为按名称已经覆盖,无需删除)

相关推荐

  1. 备份文件..

    2023-12-08 16:18:03       33 阅读
  2. 使用脚本定时备份MySql数据库文件

    2023-12-08 16:18:03       33 阅读
  3. oracle如何定期备份数据库sql文件

    2023-12-08 16:18:03       40 阅读
  4. [Unity]备份许可文件

    2023-12-08 16:18:03       12 阅读
  5. linux下数据库定时备份

    2023-12-08 16:18:03       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-08 16:18:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-08 16:18:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-08 16:18:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-08 16:18:03       20 阅读

热门阅读

  1. 服务器配置 jupyter lab,并在本地浏览器免密登陆

    2023-12-08 16:18:03       39 阅读
  2. 阿里云轻量应用服务器的使用限制

    2023-12-08 16:18:03       38 阅读
  3. Gson与FastJson详解

    2023-12-08 16:18:03       25 阅读
  4. 【LeetCode】202. 快乐数

    2023-12-08 16:18:03       34 阅读
  5. 蓝桥杯ACwing习题

    2023-12-08 16:18:03       31 阅读