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

时间:2012-12-08 15:27:19

标签: rsync

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

rsync --size-only

rsync --ignore-times

据我了解,默认情况下rsync会比较时间戳和文件大小,以决定是否应同步文件。上述选项允许用户影响此行为。

两种选择似乎都至少在口头上产生同样的结果:仅按尺寸进行比较

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

4 个答案:

答案 0 :(得分:97)

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

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

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

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

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

答案 1 :(得分:43)

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

--size-only表示即使时间戳不同,rsync也会跳过大小匹配的文件。这意味着它将同步少于默认行为的文件。它会遗漏任何不影响整体文件大小的文件。如果您在不更改文件的情况下更改了文件上的日期,并且您不希望rsync花费大量时间对这些文件进行校验以发现它们没有更改,则可以选择使用。

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

答案 2 :(得分:35)

简短的回答是--ignore-times比名称所暗示的更多。它忽略两者的时间和大小。 相比之下,--size-only正如它所说的那样。

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

  1. 比较来源和目的地的大小。
  2. 比较来源和目的地的时间戳。
  3. 比较源和目标的静态校验和。
  4. 在传输数据之前执行这些检查。值得注意的是,这意味着静态校验和与流校验和不同 - 后者在传输数据时计算。

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

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

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

    • 通过使用--checksum添加中的3用于1,但是2 执行。除非大小和校验和匹配,否则将复制文件。仅在大小匹配时才计算校验和。

答案 3 :(得分:1)

在Scientific Linux 6.7系统上,rsync的手册页说:

--ignore-times          don't skip files that match size and time

我有两个内容相同但创建日期不同的文件:

[root@windstorm ~]# ls -ls /tmp/master/usercron /tmp/new/usercron
4 -rwxrwx--- 1 root root 1595 Feb 15 03:45 /tmp/master/usercron
4 -rwxrwx--- 1 root root 1595 Feb 16 04:52 /tmp/new/usercron

[root@windstorm ~]# diff /tmp/master/usercron /tmp/new/usercron
[root@windstorm ~]# md5sum /tmp/master/usercron /tmp/new/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/master/usercron
368165347b09204ce25e2fa0f61f3bbd  /tmp/new/usercron

使用--size-only,这两个文件被视为相同:

[root@windstorm ~]# rsync -v --size-only -n  /tmp/new/usercron /tmp/master/usercron

sent 29 bytes  received 12 bytes  82.00 bytes/sec
total size is 1595  speedup is 38.90 (DRY RUN)

使用--ignore-times,这两个文件被视为不同:

[root@windstorm ~]# rsync -v --ignore-times -n  /tmp/new/usercron /tmp/master/usercron
usercron

sent 32 bytes  received 15 bytes  94.00 bytes/sec
total size is 1595  speedup is 33.94 (DRY RUN)

所以--ignore-times看起来没有任何效果。