用 tar 做增量备份核心是 --newer-mtime 选项,它按文件修改时间筛选变更文件,实现基于时间戳的差异备份;需配合动态时间戳生成、显式排除临时目录及文件,并建议加 gzip 压缩与时间戳命名。

用 tar 做增量备份,核心是利用其 --newer-mtime(或 --newer)选项筛选最近 24 小时内修改过的文件。注意:tar 本身不维护备份状态,所谓“增量”在这里指“基于时间戳的差异备份”,不是 GNU tar 的 --listed-incremental 那种带快照机制的真正增量。
用 --newer-mtime 按修改时间筛选
最常用也最可靠的方式是用 --newer-mtime 指定一个时间点,tar 会打包所有 mtime(修改时间)晚于该时间的文件:
- 先计算 24 小时前的时间戳(推荐用
date动态生成,避免手动写死): find /path/to/assets -type f -newermt "$(date -d '24 hours ago' '+%Y-%m-%d %H:%M:%S')" | xargs tar -cf backup_$(date +%Y%m%d_%H%M).tar- 更稳妥的 tar 原生命令(兼容性更好):
touch -d '24 hours ago' /tmp/last_backup_time && tar -cf backup_$(date +%Y%m%d_%H%M).tar --newer-mtime=/tmp/last_backup_time /path/to/assets && rm /tmp/last_backup_time
区分 --newer 和 --newer-mtime
--newer 比较的是文件的 mtime、ctime、atime 中最新者,可能受访问或属性变更干扰;--newer-mtime 只看修改时间,对“资产文件变更”语义更准确:
- 资产文件通常只关心内容是否被改写(即 mtime 变更)
- 避免因
chmod或touch -a触发误备份 - 如果系统不支持
--newer-mtime(如旧版 tar),可用find … -type f -mtime -1辅助,但注意-mtime -1表示“不到 24 小时”,精度略粗(按整日截断)
排除临时文件和无关目录
资产目录常含缓存、日志、node_modules 等无需备份的内容,建议显式排除:
- 用
--exclude参数(支持通配): tar -cf backup.tar --newer-mtime=/tmp/ref --exclude='*/cache/*' --exclude='*.log' --exclude='node_modules' /var/www/assets- 也可提前用
find过滤再传给 tar,逻辑更清晰: find /var/www/assets -type f -newermt "$(date -d '24 hours ago' '+%Y-%m-%d %H:%M:%S')" ! -path "*/cache/*" ! -name "*.log" | tar -T - -cf backup.tar
压缩与归档命名建议
生产环境建议加 gzip 压缩,并用时间戳命名便于识别:
- 用
tar -zcf替代-cf,生成 .tar.gz - 文件名包含日期和小时,例如:
assets_20240520_1430.tar.gz - 可追加校验信息:
tar -zcf backup.tar.gz ... && sha256sum backup.tar.gz > backup.tar.gz.sha256
不复杂但容易忽略:确保执行 tar 的用户对所有目标文件有读取权限,且磁盘空间充足。定期清理旧备份可用 find /backups -name 'assets_*.tar.gz' -mtime +7 -delete。

















