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
有三种方式来决定文件是否过时:
- 比较来源和目的地的大小。
- 比较源和目标的时间戳。
- 比较源和目标的静态校验和。
这些检查在传输数据之前执行。 值得注意的是,这意味着静态校验和与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
有任何作用。