如何编写支持tar包选择、带日志功能的bash备份恢复脚本
Bash 备份恢复脚本修正方案
原脚本问题汇总
- 恢复目录未使用绝对路径,执行脚本时如果不在对应工作目录会创建到错误位置
- 备份目录展示未过滤后缀,会显示非tar.gz格式的无关文件
read命令语法错误:赋值变量时不需要加$前缀,原写法read $filename无法正确接收用户输入- tar命令路径错误:备份文件存放在backup目录,原脚本错误从restore目录读取源文件,且未指定解压输出路径
- 缺少输入合法性校验:用户输入不存在的文件名时没有错误提示
- 日志缺少时间标识,无法区分多次操作的记录
修正后完整脚本
#!/bin/bash # 提前定义路径变量,方便后续修改 BACKUP_DIR="/home/username/userhome/backup" RESTORE_DIR="/home/username/userhome/restore" LOG_FILE="${RESTORE_DIR}/restore.log" # 1. 自动创建恢复目录,不存在才创建 mkdir -p "${RESTORE_DIR}" # 写入日志头,加时间戳 echo -e "\n=== 恢复操作开始于 $(date '+%Y-%m-%d %H:%M:%S') ===" >> "${LOG_FILE}" # 2. 仅展示备份目录下的tar.gz格式备份文件 echo "当前可用的备份文件列表:" ls -1 "${BACKUP_DIR}"/userbackup-*.tar.gz 2>/dev/null | awk -F/ '{print $NF}' # 处理没有备份文件的情况 if [ $? -ne 0 ]; then echo "错误:备份目录下没有可用的备份文件" echo "错误:备份目录下无可用备份文件" >> "${LOG_FILE}" exit 1 fi # 3. 提示用户输入要恢复的文件名 echo -e "\n请输入需要恢复的备份文件名称:" read -r filename # 校验输入的文件是否存在 if [ ! -f "${BACKUP_DIR}/${filename}" ]; then echo "错误:指定的备份文件 ${filename} 不存在" echo "错误:指定文件 ${filename} 不存在,操作终止" >> "${LOG_FILE}" exit 1 fi # 4. 执行恢复操作,过程写入日志 echo "开始恢复文件 ${filename} 到 ${RESTORE_DIR} ..." tar xzvf "${BACKUP_DIR}/${filename}" -C "${RESTORE_DIR}" &>> "${LOG_FILE}" # 判断恢复结果 if [ $? -eq 0 ]; then echo "恢复成功!操作日志已写入 ${LOG_FILE}" echo "恢复操作成功完成" >> "${LOG_FILE}" else echo "恢复失败,请查看日志 ${LOG_FILE} 排查问题" echo "恢复操作失败" >> "${LOG_FILE}" exit 1 fi
脚本功能说明
- 所有路径统一使用变量定义,后续修改路径只需要调整开头的三个变量即可
- 自动处理恢复目录不存在的情况,
mkdir -p参数不会在目录已存在时报错 - 仅过滤展示
userbackup-开头的tar.gz格式备份文件,避免无关内容干扰 - 增加了无备份文件、输入文件名不存在的异常校验,不会直接执行错误操作
- 所有操作日志追加写入,且每条记录带时间戳,方便回溯历史操作
- tar命令明确指定
-C参数将文件解压到目标恢复目录,避免解压到当前工作目录
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

