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

我试图理解两种select之间的区别

rsync --size-only 

 rsync --ignore-times 

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

这两个选项似乎至less在口头上导致相同的事情: 仅按大小进行比较

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

rsync比较文件有多种方法 – 权威的源代码是rsyncalgorithm描述: https : //www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf 。 关于rsync的wikipedia文章也非常好。

对于本地文件,rsync比较元数据,如果它看起来不需要复制文件,因为源和目标之间的大小和时间戳匹配,看起来不会更进一步。 如果他们不匹配,那么cp的文件。 但是,如果元数据匹配但文件实际上不相同呢? 那么rsync可能没有做你想要的。

相同大小的文件可能仍然发生变化。 一个简单的例子是一个文本文件,你可以改正一个错字 – 就像把“teh”改成“the”。 文件大小是相同的,但更正的文件将有一个较新的时间戳。 – 大小只说“不看时间,如果大小匹配假定文件匹配”,这将是在这种情况下的错误select。

另一方面,假设你昨天不小心做了一个大的“cp -r AB”,但是你忘了保存时间戳了,现在你想用“rsync BA”反向操作。 所有这些文件都有昨天的时间戳,即使昨天没有真正修改过,rsync默认最终会复制所有这些文件,并将时间戳更新为昨天。 – 在这种情况下,只有大小可能是你的朋友(以上面的例子为例)。

–ignore-times表示比较文件,不pipe文件是否具有相同的修改时间。 考虑一下上面的input错误的例子,不仅如此,您还可以修改input错误,但是您使用“触摸”使修改后的文件与原始文件具有相同的修改时间 – 让我们来说说您是这样偷偷摸摸的。 即使大小和时间匹配,那么–ignore-times将会对文件进行差异化处理。

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

--size-only意味着即使时间戳不同,rsync也会跳过匹配大小的文件。 这意味着它将会比默认行为同步更less的文件。 它会丢失任何不影响整个文件大小的文件。 如果你有更改文件的date而不更改文件,并且不希望rsync花费大量时间检查这些文件以发现它们没有更改,则可以使用这个选项。

--ignore-times表示即使时间戳和文件大小匹配,rsync也会校验每个文件。 这意味着它将会比默认行为同步更多的文件。 即使在文件大小相同且修改date/时间已被重置为原始值(重置date/时间不太可能在实践中完成,但可能发生)的情况下,它也将包括对文件的更改。 检查每个文件意味着它必须完全从磁盘读取,这可能会很慢。

简短的回答是, – --ignore-times超过了它的名字。 它忽略了时间和大小。 相比之下, --size-only


长久的回答是, rsync有三种方式来决定文件是否过时:

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

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

默认情况下, rsync使用1和2. 1和2可以通过一个stat一起获取,而3需要读取整个文件(这与读取传输文件无关)。 假定只有一个修饰符被指定,这意味着以下内容:

  • 通过--size-only使用--size-only ,只执行1 – 时间戳和校验和被忽略。 一个文件被复制,除非它的大小在两端是相同的。

  • 通过使用--ignore-times ,1,2或3都不会被执行。 一个文件总是被复制。

  • 通过使用--checksum除了 1 之外还使用3,但执行2。 除非大小和校验和匹配,否则将复制文件。 只有在大小匹配的情况下才会计算校验和。

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

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

我有两个具有相同内容的文件,但具有不同的创builddate:

 [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有任何作用。