我在试着理解两种选择之间的区别
rsync --size-only
和
rsync --ignore-times
据我所知,默认情况下,rsync会比较时间戳和文件大小,以决定是否应该同步文件。上面的选项允许用户影响此行为。
这两个选项似乎至少在口头上产生了相同的结果:仅按大小比较的。
我是不是漏掉了什么微妙的东西?
发布于 2012-12-09 00:18:53
rsync有几种比较文件的方法--权威的来源是rsync算法描述:https://www.andrew.cmu.edu/course/15-749/READINGS/required/cas/tridgell96.pdf。rsync上的wikipedia article也非常好。
对于本地文件,rsync比较元数据,如果它看起来不需要复制文件,因为源和目标之间的大小和时间戳匹配,则不会进一步查看。如果它们不匹配,cp就是文件。但是,如果元数据确实匹配,但文件实际上并不相同,该怎么办?那么rsync可能没有做您想要的事情。
大小相同的文件可能仍已更改。一个简单的示例是一个文本文件,您可以在其中更正一个拼写错误--比如将"teh“更改为"the”。文件大小相同,但更正后的文件将具有较新的时间戳。--size-only
说“不要看时间;如果大小匹配,就假定文件匹配”,这在这种情况下是错误的选择。
另一方面,假设你昨天不小心做了一个大的cp -r A B
,但是你忘了保存时间戳,现在你想用反向rsync B A
来做这个操作。您cp‘s的所有文件都有昨天的时间戳,即使它们在昨天并没有真正被修改,rsync在默认情况下会复制所有这些文件,并将时间戳更新到昨天。在这种情况下,--size-only
可能是你的朋友(在上面的例子中取模)。
--ignore-times
说,无论文件的修改时间是否相同,都要比较这些文件。考虑一下上面的拼写错误示例,但是您不仅更正了拼写错误,而且还使用了touch
来使更正后的文件具有与原始文件相同的修改时间--可以这么说,您在这方面是偷偷摸摸的。即使文件的大小和时间匹配,--ignore-times
也会对文件进行比较。
发布于 2017-06-04 19:52:39
简而言之,--ignore-times
所做的比它的名字所暗示的更多。它忽略了时间和大小。相比之下,--size-only
完全做到了它说的话。
长篇大论的答案是,rsync
有三种方法来确定文件是否过时:
对源的大小和源的时间戳进行比较,并对源和目标的静态校验和进行destination.
这些检查在传输数据之前执行。值得注意的是,这意味着静态校验和不同于流校验和-后者是在传输数据时计算的。
默认情况下,rsync
仅使用1和2。单个stat
可以同时获取1和2,而3需要读取整个文件(这独立于读取文件进行传输)。假设只指定了一个修饰符,这意味着:
--size-only
,仅执行1-忽略时间戳和校验和。除非文件两端的大小相同,否则文件将被复制。--ignore-times
,1、2或3都不执行。始终复制文件。通过使用--checksum
执行发布于 2014-10-16 23:25:43
您错过了rsync还可以通过校验和比较文件。
--size-only
意味着rsync将跳过大小匹配的文件,即使时间戳不同。这意味着它将同步比默认行为更少的文件。它将丢失任何更改不会影响整个文件大小的文件。如果您需要在不更改文件的情况下更改文件的日期,并且不希望rsync花费大量时间对这些文件进行校验和以发现它们没有更改,则可以使用此选项。
--ignore-times
意味着rsync将校验每个文件,即使时间戳和文件大小匹配也是如此。这意味着它将同步比默认行为更多的文件。它将包括对文件的更改,即使文件大小相同,并且修改日期/时间已重置为原始值。校验和每个文件意味着它必须完全从磁盘读取,这可能会很慢。一些构建管道会将时间戳重置为特定的日期(如1970-01-01),以确保最终的构建文件是逐位可复制的,例如,当打包成保存时间戳的tar文件时。
https://stackoverflow.com/questions/13778889
复制相似问题