rsync默认通过大小和修改时间快速检查差异,仅传变化部分;需内容级校验时加-c,预览差异用-n,保留时间戳且确保一致性应组合-avtc。

Linux 中使用 rsync 比较源与目标差异再同步,核心在于它默认就做这件事——不复制整个文件,只传变化部分。关键不是“额外开启差异比较”,而是确保你用对了选项,避免跳过校验或覆盖判断逻辑。
理解 rsync 的默认差异检测机制
rsync 默认采用“快速检查(Quick Check)”策略:只要源文件和目标文件的 大小不同 或 修改时间(mtime)不同,就认为需要同步。这个判断快、开销小,适合绝大多数场景。
- 不加任何校验选项时,它不会读取文件内容做 checksum 对比
- 如果两个文件大小和 mtime 完全一致,rsync 就跳过传输——哪怕内容其实已被篡改(这就是所谓“反被聪明误”的情况)
- 这种行为高效,但对一致性要求极高的场景(如审计、金融日志)需加强校验
强制内容级差异对比:用 -c 或 --checksum
当必须确保内容完全一致,而不仅仅是看大小和时间戳,就加上 -c 选项:
-
rsync -avc /src/ /dst/:启用完整校验和比对,每个文件都会计算并比较 checksum - 代价是速度下降(尤其大文件),因为要读取全部内容;但能发现“大小+时间戳相同但内容已变”的隐藏不一致
- 适合首次校验、关键配置同步、或修复可能出错的历史同步
先看差异、不执行同步:用 -n(dry-run)
在真正运行同步前,用 -n 模拟执行,清晰看到哪些文件会被传输、删除或跳过:
-
rsync -avn --delete /src/ /dst/:显示所有将发生的操作(包括 --delete 要删的文件) - 输出中会标出
>f+++++++++(新增)、.f..t......(仅时间戳变)、<f.st......>(内容和时间戳都变)等符号,直观反映差异类型</f.st......> - 配合 -i(itemize-changes)可获得更详细的变更说明,比如是否因权限、属主、xattr 等触发同步
保留时间戳但依然比差异:加 -t 要谨慎
-t 会让 rsync 在同步后保留源文件的修改时间,但它也会影响差异判断逻辑:
- 启用 -t 后,“快速检查”仍基于大小 + mtime,但目标端文件的 mtime 会被更新为源端值,下次同步时容易误判为“无变化”
- 若你既想保留时间戳,又不想漏掉内容差异,建议组合使用:
rsync -avtc(-a 已含 -t,-c 强制内容校验) - 单纯为了备份归档,-a 就够用;单纯为了部署最新代码,-avz 更实用











