rsync:--size-only和--ignore-times之间的区别

alf*_*ack 103 rsync

我试图了解两个选项之间的区别

rsync --size-only
Run Code Online (Sandbox Code Playgroud)

rsync --ignore-times
Run Code Online (Sandbox Code Playgroud)

我的理解是,默认情况下,rsync将比较时间戳和文件大小,以决定是否应同步文件.上面的选项允许用户影响此行为.

两种选择似乎都至少在口头上导致同样的事情:仅按大小进行比较.

我错过了一些微妙的东西吗?

ckg*_*ckg 103

rsync可以通过多种方式比较文件 - 权威来源是rsync算法描述:https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf.关于rsync 的维基百科文章也非常好.

对于本地文件,rsync会比较元数据,如果它看起来不需要复制文件,因为源和目标之间的大小和时间戳匹配,它看起来不会更远.如果它们不匹配,则cp是该文件.但是,如果元数据匹配但文件实际上不相同怎么办?然后rsync可能没有做你想要的.

大小相同的文件可能仍然已更改.一个简单的例子是一个文本文件,您可以在其中更正拼写错误 - 例如将"teh"更改为"the".文件大小相同,但更正的文件将具有较新的时间戳.--size-only表示"不要看时间;如果大小匹配假设文件匹配",在这种情况下这将是错误的选择.

另一方面,假设你昨天意外地做了一个大的"cp -r A B",但你忘了保留时间戳,现在你想要反向"rsync B A"进行操作.你所拥有的所有文件都有昨天的时间戳,即使它们昨天没有真正修改过,rsync默认会最终复制所有这些文件,并将时间戳更新为昨天.--size-only在这种情况下可能是你的朋友(以上面的例子为模).

--ignore-times表示比较文件,无论文件是否具有相同的修改时间.考虑上面的拼写错误示例,但是你不仅纠正了拼写错误,而且还使用了"触摸"来使纠正后的文件与原始文件具有相同的修改时间 - 让我们说你是偷偷摸摸的.好吧 - 即使大小和时间匹配, - 即时- 也将对文件进行差异处理.


rjm*_*nro 46

您缺少rsync还可以通过校验和比较文件.

--size-only表示即使时间戳不同,rsync也会跳过大小匹配的文件.这意味着它将同步少于默认行为的文件.它会遗漏任何不影响整体文件大小的文件.如果你有什么改变文件上的日期不改变的文件,你不想rsync将花费大量的时间执行校验这些文件,发现他们并没有改变,这是使用的选项.

--ignore-times表示rsync将校验每个文件,即使时间戳和文件大小匹配.这意味着它将同步比默认行为更多的文件.即使文件大小相同且修改日期/时间已重置为原始值,它也将包括对文件的更改.校验每个文件意味着它必须完全从磁盘读取,这可能很慢.一些构建管道将时间戳重置为某一特定日期(如1970-01-01),以确保最终的构建文件是位,如可重复位时打包成,节省了时间戳tar文件.

  • 实际上,如果你想使用校验和,我认为你需要-c选项.没有它, - ignore-times将无条件地复制所有文件. (5认同)
  • "重置日期/时间不太可能在实践中完成,但可能会发生" - 例如,当使用软件时,以可重现的版本的名义,强制将每个文件重置为1970-01-01而不是日期和实际创建/修改的时间. (4认同)

Mis*_*agi 43

简短的回答是,--ignore-times它的名字不仅仅意味着它.它忽略了两者的时间和大小.相比之下,--size-only确实如此.


答案很长,rsync有三种方法可以决定文件是否过时:

  1. 比较源和目标的大小.
  2. 比较源和目标的时间戳.
  3. 比较源和目标的静态校验和.

在传输数据之前执行这些检查.值得注意的是,这意味着静态校验和与流校验和不同 - 后者是在传输数据时计算的.

默认情况下,rsync仅使用1和2. 1和2可以一起获取stat,而3需要读取整个文件(这与读取文件以进行传输无关).假设只指定了一个修饰符,则表示以下内容:

  • 通过使用--size-only,只执行1 - 忽略时间戳和校验和.除非文件两端的大小相同,否则将复制文件.

  • 通过使用--ignore-times,不执行1,2或3.始终复制文件.

  • 通过使用--checksum,除了 1 之外还使用3 ,但是执行2 .除非大小和校验和匹配,否则将复制文件.仅在大小匹配时才计算校验和.

  • --checksum 正是我要找的。我正在复制大多数文件的时间更改的构建输出。添加 --checksum 意味着它忽略了时间差异,但确保它们一点一点地相同。这是我所期望的 --ignore-times 这样做感谢您提供更多信息。 (6认同)
  • 这个答案是如此清晰易懂。谢谢你!我尝试做到“优秀”,从手册页和现有文档开始……很多时候,它们都是超深入细节级别的东西的浓雾,而我最终又回到了一些像这样的优秀内容。 (3认同)