You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写支持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:54:03