脚本目前用于备份我的世界存档。作为通用脚本,也可以用于备份其他文件。

思路:

  1. 每天备份一次。
  2. 备份保留一定时间,到时间后删除。
  3. 以天为计量单位。

    #!/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:用精确到小时的日期串做判断(可读性更好)

思路:

  1. 先算出一条“过期边界”时间串,格式同样用 %F_%H(精确到小时)。
  2. 把所有备份文件名里的时间串提取出来,与边界串直接做字典序比较即可。
    好处:无需关心文件 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."

用法提示

  1. 放到 crontab 里,想“每小时跑一次”就加一行
    0 * * * * /path/to/backup.sh
  2. 如果想保留“最近 N 份”而不是“最近 N 小时”,把删除逻辑换成按 ls -t 取前 N 份即可。
  3. 脚本里所有路径、保留小时数 RETAIN_HOURS 都可继续自行调整。
最后修改:2026 年 08 月 11 日
如果觉得我的文章对你有用,请随意赞赏