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
################################################################################
#删除历史文件(因为按名称已经覆盖,无需删除)