rsync使用--ignore-existing参数仍重复复制相同文件原因排查
macOS环境下rsync无可见差异仍触发文件复制的核心原因
你当前使用的排查手段存在明确盲区:ls -le仅能展示文件权限、所有者、基础ACL、秒级精度的修改时间,diff仅校验文件正文内容,三类rsync默认校验的元数据维度完全没有覆盖,这些差异都会触发文件复制操作:
- 亚秒级修改时间偏差
原生APFS/HFS+文件系统的修改时间精度为纳秒级,而USB存储常用的exFAT/FAT32文件系统时间戳精度仅为2秒(FAT32)或10毫秒(exFAT),第三方NTFS挂载工具也常出现时间戳上报偏差。这类偏差普遍小于1秒,ls默认仅展示整秒级时间,肉眼核对完全一致,但rsync会读取纳秒级精度的时间戳,存在偏差即判定文件需要更新。 - 文件系统标志(file flags)差异
macOS支持通过chflags为文件设置锁定、禁止修改、隐藏等专属标记,这部分信息ls -le不会输出,必须添加-O(大写O)参数才能查看。系统自带的rsync集成了苹果官方补丁,归档模式(-a)下默认校验该属性,只要两边flags不匹配,即使内容、权限、修改时间完全一致,也会触发复制。 - 扩展属性(xattr)与Mac专属元数据差异
macOS下的文件会附带大量扩展属性,包括下载文件的隔离标记(打开时弹出“来自互联网”提示的依据)、Finder标签/颜色标记、Spotlight注释、旧版资源分支数据等。这类信息完全不会出现在ls -le的输出中,需要通过xattr -l <文件路径>命令查看。苹果定制版rsync默认校验这部分元数据,目标文件缺失对应属性或属性内容不一致时,就会判定文件需要同步。
对应解决方案
- 时间戳精度问题:执行
stat -x <源文件路径>和stat -x <目标文件路径>,对比Modify time字段的精确值确认偏差。确认后为rsync添加--modify-window=2参数,允许2秒以内的修改时间误差,即可适配低精度文件系统,消除误判。 - 文件flags差异:执行
ls -lO <源文件路径>和ls -lO <目标文件路径>对比flags列,不需要同步flags时为rsync添加--no-flags参数跳过校验即可。 - 扩展属性差异:执行
xattr -l <源文件路径>和xattr -l <目标文件路径>对比属性列表,不需要同步xattr时为rsync添加--no-xattrs参数跳过校验;需要同步扩展属性时,确认rsync添加了--xattrs参数(Homebrew安装的第三方rsync默认不开启该参数)。 - 第三方NTFS驱动导致的元数据上报异常:可临时添加
--size-only参数,仅通过文件大小判定是否需要同步,规避驱动上报不准的问题。
内容的提问来源于stack exchange,提问作者Tom S
相关产品推荐
相关产品推荐

