133

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

rsync --size-only

rsync --ignore-times

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

这两种选择似乎,至少在口头上会导致相同的结果:仅按大小比较

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

4

4 回答 4

126

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。你 cp'ed 的所有文件都有昨天的时间戳,即使它们昨天并没有真正修改,并且默认情况下 rsync 最终会复制所有这些文件,并将时间戳也更新为昨天。--size-only在这种情况下可能是您的朋友(以上面的示例为模)。

--ignore-times表示无论文件是否具有相同的修改时间,都要比较文件。考虑上面的拼写错误示例,但是您不仅纠正了拼写错误,而且还touch使纠正后的文件具有与原始文件相同的修改时间——假设您这样偷偷摸摸。即使大小和时间匹配,也会--ignore-times对文件进行比较。

于 2012-12-08T16:18:52.593 回答
94

简短的回答是,它--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。除非大小和校验和匹配,否则将复制文件。仅当大小匹配时才计算校验和。

于 2017-06-04T11:52:39.000 回答
53

您错过了 rsync 也可以通过校验和比较文件。

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

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

于 2014-10-16T15:25:43.343 回答
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任何影响。

于 2016-02-16T16:37:26.577 回答