脚本目前用于备份我的世界存档。作为通用脚本,也可以用于备份其他文件。
思路:
- 每天备份一次。
- 备份保留一定时间,到时间后删除。
以天为计量单位。
#!/bin/bash # 备份 MC 世界数据,保留 5 个月 set -e # 可改路径 SRC_DIR="/path to/mc-server/worlds" #要备份的文件夹 DST_DIR="/path to/MC/backups" #备份文件存放位置 RETAIN_DAYS=150 # 备份时间。5 个月 ≈ 150 天 mkdir -p "$DST_DIR" # 生成带时间戳的文件名 TS=$(date +%F_%H%M%S) FILE="world-${TS}.tar.gz" # 打包世界目录 tar -czf "$DST_DIR/$FILE" -C "$SRC_DIR" . # 删除 150 天前的备份 find "$DST_DIR" -type f -name 'world-*.tar.gz' -mtime +$RETAIN_DAYS -delete # 日志 logger "MC world backup: $FILE created, old backups cleaned."
细化(一小时为计量单位):
方案 A:继续用 find,但把“150 天”换成“3600 小时”
#!/bin/bash
# 备份 MC 世界数据,保留 3600 小时(≈ 5 个月)
set -e
SRC_DIR="/path to/mc-server/worlds" #要备份的文件夹
DST_DIR="/path to/MC/backups" #备份文件存放位置
RETAIN_HOURS=3600 #保存时间。 5 个月 ≈ 3600 小时
mkdir -p "$DST_DIR"
TS=$(date +%F_%H%M%S)
FILE="world-${TS}.tar.gz"
tar -czf "$DST_DIR/$FILE" -C "$SRC_DIR" .
# 删除“超过 3600 小时”的备份
# -mmin 的单位是“分钟”,3600 h * 60 = 216000 min
find "$DST_DIR" -type f -name 'world-*.tar.gz' -mmin +$((RETAIN_HOURS * 60)) -delete
logger "MC world backup: $FILE created, old backups cleaned."方案 B:用精确到小时的日期串做判断(可读性更好)
思路:
- 先算出一条“过期边界”时间串,格式同样用
%F_%H(精确到小时)。 - 把所有备份文件名里的时间串提取出来,与边界串直接做字典序比较即可。
好处:无需关心文件 mtime,只看你自己的文件名时间戳,逻辑一目了然。
#!/bin/bash
set -e
SRC_DIR="/path to/mc-server/worlds" #要备份的文件夹
DST_DIR="/path to/MC/backups" #备份文件存放位置
RETAIN_HOURS=3600 #备份保留时间。 5 个月 ≈ 3600 小时
mkdir -p "$DST_DIR"
# 1. 备份
TS=$(date +%F_%H%M%S)
FILE="world-${TS}.tar.gz"
tar -czf "$DST_DIR/$FILE" -C "$SRC_DIR" .
# 2. 计算“过期边界”时间串(同样精确到小时)
CUTOFF=$(date -d "$RETAIN_HOURS hours ago" +%F_%H)
# 3. 遍历所有备份,删除“时间串 ≤ 边界串”的文件
for f in "$DST_DIR"/world-*.tar.gz; do
# 提取文件名里的 %F_%H 部分(前 13 个字符)
FILE_TS=${f##*/world-} # 去掉前缀
FILE_TS=${FILE_TS:0:13} # 只要年月日_时
if [[ $FILE_TS < $CUTOFF ]] || [[ $FILE_TS = $CUTOFF ]]; then
rm -f "$f"
fi
done
logger "MC world backup: $FILE created, old backups cleaned."用法提示
- 放到 crontab 里,想“每小时跑一次”就加一行
0 * * * * /path/to/backup.sh - 如果想保留“最近 N 份”而不是“最近 N 小时”,把删除逻辑换成按
ls -t取前 N 份即可。 - 脚本里所有路径、保留小时数
RETAIN_HOURS都可继续自行调整。