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
现在对应你的四个命令看差异:
- 第一个命令没加
-t,--size-only+--ignore-times让rsync只看大小,所以old和new的foo.xml大小相同,不会同步,符合预期。 - 第二个命令加了
--compare-dest,因为没-t,rsync用--size-only+--ignore-times的逻辑判断:new的foo.xml和old的大小一致,判定为相同文件,所以不会复制到delta,也符合预期。 - 第三个命令加了
-t,但因为是从old同步到new,new里已经有foo.xml且大小相同,所以rsync判断不需要同步,这也没问题。 - 第四个命令就是你困惑的点:加了
-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
相关产品推荐
相关产品推荐

