这个脚本主要是配合前面制作的定时备份脚本一起使用,可以直接回复上一次备份的文件。

思路:

  1. 备份目录里按 mtime 从新到旧排序,给它们一个序号:1=最新,2=次新……
  2. 在脚本里把 RESTORE_INDEX 设成想要的数字。
  3. 脚本先找到对应的归档,再执行恢复。
  4. 这个恢复脚本有2中恢复模式:安全模式和极速模式。通过修改脚本中的“MODE”值进行切换。
  5. 安全模式:先解包到临时目录,确认无误后再覆盖原 worlds 目录。
  6. 极速模式:直接清空 worlds,再把备份内容原样搬进去,省一倍磁盘空间/时间,但 不保留当前世界任何副本
  7. 支持“干跑”模式(DRY_RUN=1)先只看不会真覆盖。
#!/bin/bash
# MC 世界恢复脚本   ——  支持两种还原方式
set -e

######################## 用户配置 ########################
DST_DIR="/path to/MC/backups"           #备份文件所在文件夹
SRC_DIR="/path to/mc-server/worlds"     #要恢复的目录
RESTORE_INDEX=1          # 1=最新 2=次新 …
DRY_RUN=0                # 设为 1 只预览不恢复
MODE="safe"              # 默认安全模式;可选“safe”“quick”
##########################################################

# ---------- 1. 解析命令行 ----------
while getopts ":m:" opt; do
  case $opt in
    m) MODE="$OPTARG" ;;
    \?) echo "无效选项: -$OPTARG" >&2; exit 1 ;;
  esac
done
case "$MODE" in
  safe|quick) ;;
  *) echo "❌ 模式只能是 safe 或 quick"; exit 1 ;;
esac

# ---------- 2. 挑选备份 ----------
mapfile -t BACKUPS < <(find "$DST_DIR" -maxdepth 1 -type f -name 'world-*-wk[0-7].tar.gz' -printf '%T@ %p\n' | sort -rn | cut -d' ' -f2-)
TOTAL=${#BACKUPS[@]}
[[ $TOTAL -eq 0 ]] && { echo "❌ 找不到任何备份"; exit 1; }
[[ $RESTORE_INDEX -lt 1 || $RESTORE_INDEX -gt $TOTAL ]] && { echo "❌ 序号 $RESTORE_INDEX 超出范围(共 $TOTAL 个)"; exit 1; }
PICKED=${BACKUPS[$((RESTORE_INDEX-1))]}
echo "选中备份:$(basename "$PICKED")"

# ---------- 3. 干跑 ----------
if [[ $DRY_RUN -eq 1 ]]; then
  echo "===== 干跑模式,即将恢复的文件列表 ====="
  tar -tzf "$PICKED" | head -20
  echo "……合计 $(tar -tzf "$PICKED" | wc -l) 个文件"
  exit 0
fi

# ---------- 4. 停服 ----------
echo "⏳ 停止 mc-server 服务 …"
sudo systemctl stop mc-server || true

# ---------- 5. 按模式恢复 ----------
case "$MODE" in
  safe)
    TMP=$(mktemp -d)
    trap "rm -rf '$TMP'" EXIT
    echo "⏳ 安全模式:先解包到临时目录 $TMP"
    tar -xzf "$PICKED" -C "$TMP"
    echo "⏳ 备份当前世界到 ${SRC_DIR}.bak-$(date +%F_%H%M%S)"
    cp -a "$SRC_DIR" "${SRC_DIR}.bak-$(date +%F_%H%M%S)"
    echo "⏳ 清空并覆盖 $SRC_DIR"
    rm -rf "$SRC_DIR"/*
    cp -a "$TMP"/* "$SRC_DIR"/
    ;;
  quick)
    echo "⏳ 极速模式:直接清空 $SRC_DIR 并解压"
    rm -rf "$SRC_DIR"/*
    tar -xzf "$PICKED" -C "$SRC_DIR"
    ;;
esac

# ---------- 6. 启动服务 ----------
echo "⏳ 启动 mc-server 服务 …"
sudo systemctl start mc-server

logger "MC world restored ($(basename "$PICKED")) mode=$MODE"
echo "✅ 恢复完成!模式:$MODE"

脚本中涉及到的服务开始与暂停“systemctl start/stop mc-server”根据实际情况修改。

最后修改:2026 年 08 月 11 日
如果觉得我的文章对你有用,请随意赞赏