rsync 默认是镜像同步而非备份,删除源文件会导致目标同步删除;可靠备份需显式启用--backup、--backup-dir或--link-dest机制。

rsync 能做增量同步,但默认不自动保留历史版本;要实现可靠备份,必须配合 --backup、--backup-dir 或硬链接等机制,否则删了源文件,备份里也跟着丢。
为什么 rsync 同步后删源文件,目标也变空?
这是最常被误解的点:rsync 默认是“镜像同步”,不是“备份”。它只保证目标和源内容一致,不保存旧文件。
-
rsync -av /src/ /dst/会删除/dst/中存在但/src/中已不存在的文件 - 如果源里删了一个配置文件,下次同步,目标里那个文件就没了——根本不是备份,是覆盖
- 真正备份需要显式启用备份策略,比如
--backup把被覆盖的旧文件重命名存起来
用 --backup 实现带时间戳的简单增量备份
适合小规模、单次备份需求,不依赖外部工具,但需注意路径和命名冲突。
- 加
--backup后,每次覆盖文件时,原文件会重命名为filename~(末尾加波浪线) - 用
--suffix=".20241005"可自定义后缀,但需手动更新,否则所有备份都挤在同一个后缀下 - 更实用的是
--backup-dir+--delete-after组合:
rsync -av --backup --backup-dir="/backup/20241005" --delete-after /src/ /dst/
这样旧文件全移进独立日期目录,/dst/ 始终是最新快照,历史保留在 /backup/20241005/ 下。
用 --link-dest 实现空间高效的多版本硬链接备份
适合每日备份、节省磁盘空间,但要求源和备份目录在同一文件系统(因为硬链接不能跨设备)。
- 每次备份前,先创建新目录:
mkdir /backup/20241006 - 然后用
--link-dest指向上一个完整备份目录:
rsync -av --delete --link-dest="/backup/20241005" /src/ /backup/20241006/
rsync 会复用未变化的文件的硬链接,只存储差异部分。多个备份目录看起来各自完整,实际共享大部分 inode。
- 务必确认
/backup/20241005存在且可读,否则--link-dest失效,变成全量复制 - 不能对
--link-dest目录做rsync --delete,否则可能破坏其他备份的硬链接引用
排除临时文件和元数据,避免同步失败或污染备份
rsync 遇到 .DS_Store、Thumbs.db、锁文件或挂载点时可能报错或拖慢速度,必须主动过滤。
- 用
--exclude排除常见干扰项:
rsync -av --exclude="*.tmp" --exclude=".git/" --exclude="node_modules/" --exclude=".DS_Store" /src/ /dst/
- 更稳妥的是用
--filter规则文件,尤其当排除模式复杂时 - 注意
--exclude的斜杠结尾:--exclude="logs/"只排除目录,--exclude="logs"会误杀同名文件 - 如果源含符号链接,加
-H保留链接本身(而非目标),否则默认不传输链接
硬链接备份看着省空间,但一旦底层文件系统损坏,所有依赖它的备份都可能连锁失效;--backup-dir 更直观可控,但磁盘用量随天数线性增长。选哪种,取决于你更怕丢数据,还是更怕管磁盘空间。











