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


114

我试图了解两种选择之间的区别

rsync --size-only

rsync --ignore-times

据我了解,默认情况下rsync将同时比较时间戳和文件大小,以便确定是否应该同步文件。上面的选项使用户可以影响此行为。

至少在口头上,这两个选项似乎导致相同的结果:仅按大小进行比较

我在这里想念些微妙的东西吗?


18
这可能更适合SuperUser.comUnix.SE之类的东西,因为它是关于使用现有的(与非编程相关的)工具,而不是与编写代码直接相关的任何工具。
杰里·科芬

Answers:


110

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会做的文件的差异,即使规模和时间匹配。


58

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


1
--checksum正是我想要的。我正在复制仅对大多数文件进行时间更改的生成输出。添加--checksum意味着它忽略了时差,但确保它们一点一点相同。这就是我所期望的-忽略时间这样做,谢谢您的其他信息。
Joseph Connolly19年

50

您缺少rsync还可以按校验和比较文件的信息。

--size-only意味着即使时间戳不同,rsync也会跳过大小匹配的文件。这意味着它将同步的文件数量少于默认行为。它将丢失所有不影响整体文件大小的更改的文件。如果您可以更改文件上的日期而不更改文件,并且您不希望rsync花大量时间对这些文件进行校验和以发现它们没有更改,则可以使用此选项。

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


4
“实际上不太可能完成日期/时间的重置,但是可能会发生。”-例如,当使用以可复制的版本的名义强行将每个文件而不是日期和日期重置为1970-01-01的软件时实际创建/修改的时间。

10
实际上,我想如果要使用校验和,则需要-c选项。没有它,--ignore-times将无条件复制所有文件。
爱德华·福尔克

1
-a选项可能会覆盖这些选项。在我的情况下,我使用--compare-dir =和--size-only并得到了意外的结果。将-a更改为-r可解决此问题。
dbagnara

@dbagnara我今天确认–size-only仅位于-a之上,或“覆盖” -a。我安装了一个硬盘,无论出于何种原因,所有修改时间都增加了一个月。Rsync到备份正在复制每个文件(-a ON)。添加--size-only解决了该问题,并导致了预期的结果(因此,-a --size-only)。因此,我得出结论,仅大小优先于存档。
Tommy

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


2
--ignore-times即使它们的时间戳相同,也会复制文件。
MiyaMiyagi '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.