You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

rsync中'-t'选项为何会抵消'--compare-dest'的作用?

rsync中'-t'选项为何会抵消'--compare-dest'的作用?

这个问题我之前折腾rsync的时候也踩过同款坑,核心是-t和--compare-dest的判断逻辑优先级问题,咱们结合你的例子一步步掰扯清楚:

首先先明确你的文件前提:new/foo.xml和old/foo.xml内容完全一致(大小相同),但修改时间(mtime)不一样,这是整个问题的关键。

先拆解每个选项的核心逻辑,再看组合后的冲突:

  • --size-only:只通过文件大小判断是否需要同步,忽略其他属性
  • --ignore-times:强制忽略修改时间的差异,哪怕时间不同,只要大小对得上就认为是相同文件
  • --compare-dest=DIR:同步时先参考指定目录的文件,如果源文件和参考目录的文件“判定为相同”,就不往目标目录复制
  • -t:保留源文件的修改时间,同时——划重点——会让rsync把修改时间作为文件“是否相同”的核心判断条件之一,优先级高于--ignore-times和--size-only

现在对应你的四个命令看差异:

  1. 第一个命令没加-t,--size-only+--ignore-times让rsync只看大小,所以old和new的foo.xml大小相同,不会同步,符合预期。
  2. 第二个命令加了--compare-dest,因为没-t,rsync用--size-only+--ignore-times的逻辑判断:new的foo.xml和old的大小一致,判定为相同文件,所以不会复制到delta,也符合预期。
  3. 第三个命令加了-t,但因为是从old同步到new,new里已经有foo.xml且大小相同,所以rsync判断不需要同步,这也没问题。
  4. 第四个命令就是你困惑的点:加了-t+--compare-dest,为啥会复制foo.xml到delta?
    原因是:当-t存在时,rsync对--compare-dest的判断逻辑直接变了——它不再只看文件大小,而是会强制检查修改时间是否一致。你的new/foo.xml和old/foo.xml mtime不同,哪怕内容完全一样,rsync也会判定这两个是“不同的文件”,所以不会触发--compare-dest的跳过逻辑,最终还是把new的foo.xml复制到了delta里。

简单总结就是:-t选项会让rsync把修改时间当成文件身份的一部分,哪怕你加了--ignore-times和--size-only,它也会在--compare-dest的判断里优先检查时间差异,直接覆盖了原本只看大小的逻辑,看起来就像是-t“抵消”了--compare-dest的作用。

备注:内容来源于stack exchange,提问作者Chatanga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 08:33:10