该脚本实现了在Linux中备份并删除过期的备份文件,当备份次数超出限制时才删除超出日期限制的备份文件,不用担心长时间不备份会导致备份目录被清空。此外,备份前会检查磁盘空间是否足够,备份后会检查备份文件是否需要压缩。

|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
#!/bin/bash # 最后更新:2025/09/11 # 脚本开发:刘智林 # 脚本功能:数据备份通用脚本 # 特殊说明:当备份次数超出限制时才删除超出日期限制的备份文件 # 脚本参数: # -s srcFile 待备份的文件或目录(必填),绝对路径或者脚本相对路径 # -b bakPath 备份目标地址(必填),末尾不带'/',绝对路径或者脚本相对路径 # -t bakType 备份目标类型,dir/zip/tar/all(默认) # -e expTimes 保留备份文件的限制次数(默认15次) # -d expDates 保留备份文件的限制天数(默认30天) # ./backup.sh -s '/home/weblogic/war' -b '/home/weblogic/backup' -t 'zip' -e '7' -d '14' workLog="${PWD}/backup.log" getTime (){ nowTime=`date +'%Y%m%d%H%M%S'` } while getopts 's:b:t:e:d:' OPT do case ${OPT} in s) srcFile="$OPTARG";; b) bakPath="$OPTARG";; t) bakType="$OPTARG";; e) expTimes="$OPTARG";; d) expDates="$OPTARG";; esac done echo ">>>>>>>>>>>>>>>>>>>>>>>>> 备份${srcFile}-${nowTime:0:8} <<<<<<<<<<<<<<<<<<<<<<<<<" >> ${workLog} getTime if [ -z "${srcFile}" ] || [ -z "`ls -l ${srcFile}`" ] then echo -e "${nowTime}\t没有输入待备份的文件或路径,或${srcFile}不存在\n" >> ${workLog} exit 7 fi [ -z "${bakPath}" ] && echo -e "${nowTime}\t没有输入备份目标路径\n" >> ${workLog} && exit 8 [ ! -d "${bakPath}" ] && mkdir -p ${bakPath} && echo -e "${nowTime}\t已创建备份目标文件夹${PWD}/${bakPath}" >> ${workLog} [ -z "${bakType}" ] && bakType="all" [ -z "${expTimes}" ] && expTimes=15 [ -z "${expDates}" ] && expDates=30 # 检查备份目录中的备份次数 case "${bakType}" in dir) varTypes="-type d";; zip) typeName="zip" varTypes="-name '*.${typeName}'" ;; tar) typeName="tar.gz" varTypes="-name '*.${typeName}'" ;; *) varTypes="";; esac case "${bakType}" in zip|tar) bakTimes=`ls -l ${bakPath} | grep *.${typeName} | wc -l`;; *) bakTimes=`ls -l ${bakPath} | grep -Ev ^"total|总用量" | wc -l`;; esac # 删除过期的备份文件 getTime echo -e "${nowTime}\t当前已备份${bakTimes}次" >> ${workLog} getTime if [ ${bakTimes} -gt ${expTimes} ] then [ "${bakPath%/*}" = "/home/`whoami`" ] && echo "禁止对用户家目录进行删除操作" && exit 1 find ${bakPath} ${varTypes} -mtime +${expDates} -exec rm -rf {} \; echo -e "${nowTime}\t已删除过期的备份文件" >> ${workLog} fi # 判断磁盘空间 getTime discAvail=`df -h ${srcFile} | awk '{print $4}' | tail -n 1` discNeeds=`du -sh ${srcFile} | awk '{print $1}'` getResult (){ availNum="`echo ${discAvail} | sed 's/.$//'`" needsNum="`echo ${discNeeds} | sed 's/.$//'`" result=`echo "scale=3; ${availNum} - ${needsNum}" | bc` [[ ${result} < 0 ]] && echo -e "${nowTime}\t磁盘空间不足,无法备份\n" >> ${workLog} && exit 1 } case ${discAvail: -1} in G) [ "${discNeeds: -1}" = "G" ] && getResult;; M) [ "${discNeeds: -1}" = "G" ] && echo -e "${nowTime}\t磁盘空间不足,无法备份\n" >> ${workLog} && exit 1 [ "${discNeeds: -1}" = "M" ] && getResult;; K) echo -e "${nowTime}\t磁盘空间不足,无法备份\n" >> ${workLog} && exit 1;; esac # 按当前时间创建备份文件夹 getTime bakPath="${bakPath}/${nowTime}" [ -d ${bakPath} ] && [ "${bakPath%/*}" != "/home/`whoami`" ] && rm -rf ${bakPath} mkdir -p ${bakPath} # 备份数据 echo -e "${nowTime}\t开始备份${srcFile}至${bakPath}/" >> ${workLog} cp -rf ${srcFile} ${bakPath}/ [ $? -ne 0 ] && getTime && echo -e "${nowTime}\t复制文件时遇到错误,备份失败\n" >> ${workLog} && exit 3 # 检查备份文件是否需要压缩 cd ${bakPath} case ${bakType} in zip) [ "${srcFile##*.}" != "${typeName}" ] && zip -m -q -r ${srcFile##*/}.${typeName} *;; tar) [ "${srcFile##*.}" != "${typeName}" ] && tar -zcf ${srcFile##*/}.${typeName} * --remove-files;; esac getTime echo -e "${nowTime}\t已将备份文件压缩为${bakType}格式" >> ${workLog} getTime echo -e ">>>>>>>>>>>>>>> ${nowTime} <<<<<<<<<<<<<<<\n" >> ${workLog} |
原创文章禁止转载:技术学堂 » Linux数据备份通用Shell脚本

技术学堂














