我试图了解两种选择之间的区别
rsync --size-only
和
rsync --ignore-times
据我了解,默认情况下rsync将同时比较时间戳和文件大小,以便确定是否应该同步文件。上面的选项使用户可以影响此行为。
至少在口头上,这两个选项似乎导致相同的结果:仅按大小进行比较。
我在这里想念些微妙的东西吗?
我试图了解两种选择之间的区别
rsync --size-only
和
rsync --ignore-times
据我了解,默认情况下rsync将同时比较时间戳和文件大小,以便确定是否应该同步文件。上面的选项使用户可以影响此行为。
至少在口头上,这两个选项似乎导致相同的结果:仅按大小进行比较。
我在这里想念些微妙的东西吗?
Answers:
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
。即使您昨天没有真正修改过这些文件,您cped的文件都有昨天的时间戳,默认情况下,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
任何作用。
--ignore-times
即使它们的时间戳相同,也会复制文件。