脚本目前用于备份我的世界存档。作为通用脚本,也可以用于备份其他文件。 ## 思路: 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` 都可继续自行调整。 Loading... 脚本目前用于备份我的世界存档。作为通用脚本,也可以用于备份其他文件。 ## 思路: 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` 都可继续自行调整。 最后修改:2025 年 10 月 25 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏