任何人都可以澄清rsync的--checksum
和--ignore-times
选项之间的区别?
我的理解如下:
--checksum
如果文件大小和时间匹配,则会在两端执行校验和以查看文件是否真的相同。
--ignore-times
无论两端的文件时间是否相同,都要传输每个文件。 由于它仍将使用delta转换algorithm,如果一个文件实际上是相同的,则不会传送任何文件。
这是技术上的差异,但据我所知,它们在语义上是相同的。
所以,我想知道的是:
通常,当源文件和目标文件具有相同的大小和时间时, rsync
跳过文件。 这是一种启发式的方法,通常这是一个好主意,因为它可以防止rsync
检查源和目标端很可能相同的文件内容。
--ignore-times
告诉rsync
closures文件时间和大小的启发式,从而无条件地将所有文件从源文件传输到目标文件。 然后, rsync
将继续读取源文件中的每个文件,因为它需要使用增量转换algorithm,或者根据是否指定--whole-file
选项,完整发送每个文件。
--checksum
也修改文件时间和大小的启发式,但在这里它忽略了时间,只检查大小。 大小不一的源文件和目标文件会被传输,因为它们明显不同。 对大小相同的文件进行校验和(使用rsync
版本3.0.0以上版本的MD5,或者在早期版本中使用MD4),并且发现有不同和的文件也被传输。
如果源端和目标端大部分是相同的,则 – 大多数文件都会导致双方进行校验和。 这可能需要很长时间,但结果是数据的最小最小值实际上将通过导线传送,特别是如果使用增量传送algorithm。 当然,如果networking非常慢,CPU速度非常快,那么这只是一个胜利。
另一方面, --ignore-times
将通过networking发送更多的数据,并且会导致所有的源文件被读取,但是至less不会增加在源码上计算许多密码强的哈希码的额外负担和目标CPU。 当你的networking速度很快,或者你的CPU比较慢的时候,我会希望这个选项比--checksum
更好。
我想我只会使用--checksum
或者--ignore-times
如果我把文件传输到怀疑某些文件的内容被破坏,但是其修改时间没有改变的目的地。 我不能真正想到使用其中任何一个选项,尽pipe可能还有其他用例。
如果您已经使用另一个系统来同步文件,那么校验和也是有用的,这个文件还没有保存时间戳。 校验和只会传输不同的文件,并更新接收端的所有时间戳,以便它们匹配
一个细节:校验和选项在一端检查整个文件,然后在另一端检查整个文件。 如果你的文件有点大,这种杀死并行性。
另外,如果你有很大的文件,你最有可能会碰到--checksum
超时,因为你不用-I
。
从info rsync
关于--checksum
选项的信息 – “由于除了文件传输期间发生的自动校验和validation之外,还会发生连接两端所有文件的整个文件校验和,因此此选项可能非常慢。 “
--ignore-times
选项可能会导致所有文件增量编码,并且增量转换algorithm(增量编码)至less和校验和一样慢。
我不知道rsync --ignore-times
是否足够聪明,以避免在delta-transfer会导致没有任何被转移的频繁情况下的“自动传输后validation”。
对于--ignore-times
:
两者都是“非常缓慢的”,而“ --ignore-times
”则可能更慢(由于上述两种可能性)。
好问题 – 如果您发现任何性能差异,请发帖。