这个脚本主要是配合前面制作的定时备份脚本一起使用,可以直接回复上一次备份的文件。 ### 思路: 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”根据实际情况修改。 Loading... 这个脚本主要是配合前面制作的定时备份脚本一起使用,可以直接回复上一次备份的文件。 ### 思路: 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”根据实际情况修改。 最后修改:2025 年 10 月 25 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏