tar增量备份核心是用--newer选项配合时间戳文件,通过crontab定时执行脚本,只打包自上次备份以来修改过的文件,并自动更新时间戳作为下一轮基准。
用 tar 做增量备份,核心是利用 --newer(或 --newer-mtime)选项配合时间戳文件,再通过 crontab 定时触发。关键不是每次全量打包,而是只打包自上次备份以来有变动的文件。
增量依赖“上次备份的时间点”,需手动或自动维护一个参考时间戳文件(如 /backup/last_backup.time)。首次运行前创建它:
touch /backup/last_backup.time 初始化touch /backup/last_backup.time 更新它,作为下一轮增量的基准写个 shell 脚本(比如 /backup/incr_backup.sh),内容示例如下:
#!/bin/bashSRC_DIR="/home/user/docs"BACKUP_DIR="/backup"STAMP_FILE="$BACKUP_DIR/last_backup.time"DATE=$(date +%Y%m%d_%H%M%S)BACKUP_FILE="$BACKUP_DIR/incr_$DATE.tar.gz"<h1>打包比时间戳新的文件(含子目录)</h1><p>tar -czf "$BACKUP_FILE" --newer="$STAMP_FILE" -C "$SRC_DIR" .</p><h1>成功则更新时间戳</h1><p>if [ $? -eq 0 ]; thentouch "$STAMP_FILE"fi
注意:--newer 比较的是文件的修改时间(mtime),若需按修改时间而非状态变更时间,可用 --newer-mtime 更精确。
运行 crontab -e 添加一行,例如每天凌晨 2 点执行:
0 2 * * * /bin/bash /backup/incr_backup.sh >/dev/null 2>&1
/bin/bash 显式调用 shell,避免环境变量缺失导致 tar 或 touch 找不到>/dev/null 2>&1 屏蔽标准输出和错误,如需日志可改为 >/backup/backup.log 2>&1
chmod +x /backup/incr_backup.sh
增量备份会不断生成新包,建议加简单清理逻辑:
find "$BACKUP_DIR" -name "incr_*.tar.gz" -mtime +7 -delete,自动删除 7 天前的备份stat -c "%y" "$STAMP_FILE" 查看实际时间,或改用 date -d "1 hour ago" +%Y%m%d%H%M%S 动态计算(适合简单场景)tar -tzf $BACKUP_FILE >/dev/null 验证包完整性)再更新时间戳不复杂但容易忽略细节:时间戳文件必须可写、路径一致、脚本里用绝对路径调用命令。跑通一次后,就能静默持续积累增量包了。