我试图了解两个选项之间的区别
rsync --size-only
和
rsync --ignore-times
据我了解,默认情况下 rsync 会比较时间戳和文件大小,以决定是否应该同步文件。上述选项允许用户影响此行为。
这两种选择似乎,至少在口头上会导致相同的结果:仅按大小比较。
我在这里错过了一些微妙的东西吗?
我试图了解两个选项之间的区别
rsync --size-only
和
rsync --ignore-times
据我了解,默认情况下 rsync 会比较时间戳和文件大小,以决定是否应该同步文件。上述选项允许用户影响此行为。
这两种选择似乎,至少在口头上会导致相同的结果:仅按大小比较。
我在这里错过了一些微妙的东西吗?
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
对文件进行比较。
简短的回答是,它--ignore-times
所做的比它的名字所暗示的要多。它忽略了时间和大小。相反,--size-only
它完全按照它所说的去做。
长答案是,rsync
有三种方法可以确定文件是否过时:
这些检查在传输数据之前执行。值得注意的是,这意味着静态校验和不同于流校验和——后者是在传输数据时计算的。
默认情况下,rsync
仅使用 1 和 2。 1 和 2 可以通过单个 一起获取stat
,而 3 需要读取整个文件(这与读取文件进行传输无关)。假设只指定了一个修饰符,这意味着以下内容:
通过使用--size-only
,仅执行 1 - 忽略时间戳和校验和。除非文件两端的大小相同,否则将复制文件。
通过使用--ignore-times
,不会执行 1、2 或 3。始终复制文件。
通过使用--checksum
,除了1 之外还使用了 3,但不执行 2。除非大小和校验和匹配,否则将复制文件。仅当大小匹配时才计算校验和。
您错过了 rsync 也可以通过校验和比较文件。
--size-only
意味着 rsync 将跳过大小匹配的文件,即使时间戳不同。这意味着它将同步比默认行为更少的文件。它会错过任何不影响整体文件大小的更改的文件。如果您有一些东西可以在不更改文件的情况下更改文件的日期,并且您不希望 rsync 花费大量时间对这些文件进行校验和以发现它们没有更改,则可以使用此选项。
--ignore-times
意味着 rsync 将对每个文件进行校验和,即使时间戳和文件大小匹配。这意味着它将同步比默认行为更多的文件。即使文件大小相同并且修改日期/时间已重置为原始值,它也会包括对文件的更改。校验和每个文件意味着它必须完全从磁盘读取,这可能很慢。一些构建管道会将时间戳重置为特定日期(如 1970-01-01),以确保最终构建文件可逐位重现,例如,当打包到保存时间戳的 tar 文件时。
在 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
任何影响。