这个脚本主要是配合前面制作的定时备份脚本一起使用,可以直接回复上一次备份的文件。
思路:
- 备份目录里按
mtime从新到旧排序,给它们一个序号:1=最新,2=次新…… - 在脚本里把
RESTORE_INDEX设成想要的数字。 - 脚本先找到对应的归档,再执行恢复。
- 这个恢复脚本有2中恢复模式:安全模式和极速模式。通过修改脚本中的“MODE”值进行切换。
- 安全模式:先解包到临时目录,确认无误后再覆盖原
worlds目录。 - 极速模式:直接清空
worlds,再把备份内容原样搬进去,省一倍磁盘空间/时间,但 不保留当前世界任何副本。 - 支持“干跑”模式(
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”根据实际情况修改。