27

有很多关于 rsync 校验和的线程,但似乎没有一个解决这个需求,这将是最有效和最快的同步方式,至少在我的情况下:

  • 相同时间和相同大小 ► 跳过文件(无传输,无校验和)
  • 不同大小 ► 传输文件(无校验和)
  • 不同时间和相同大小 ► 执行校验和 ► 仅在校验和不同时传输

我注意到--checksum如果有很多文件,该选项确实需要很长时间才能镜像文件夹。单独使用此选项将对每个文件运行校验和,这非常安全但非常慢。此外,它会导致读取访问开销来计算校验和。
该选项--ignore-times不是我想要的,如果时间和大小都匹配,文件不同的机会微不足道,我愿意冒险不转移。
该选项--size-only不完整,因为具有相同大小但不同时间的文件很有可能实际上是不同的文件(例如,更改另一个字符可能不会影响大小,只是编辑时间)。

有没有办法按照上面的组合使用 rsync (我错过了手册页中的某些内容)或任何其他 Linux 工具来执行镜像?
谢谢。

4

2 回答 2

24

在确定是否传输文件时(或使用--dry-run, 是否列出文件),rsync 将始终传输文件大小不同的文件。但是,当文件大小相同时,rsync 有几个选项:

  • with --size-only: 从不传输文件
  • with --ignore-times: 总是传输文件
  • 默认值:如果时间戳不同,则传输文件
  • with --checksum:计算校验和并传输文件(如果它们不同)

您想要的行为将是最后两个的组合:“如果时间戳不同,则计算校验和并在校验和不同时传输文件”。目前这不是 rsync 中的选项。

不幸的是,查看 rsync 源代码,似乎添加此功能并非易事。目前,如果使用校验和,远程 rsync 会收集大小、时间戳和校验和信息并将它们一起发送。所需的行为将要求远程 rsync 首先发送大小和时间戳,并且当本地 rsync 确定需要校验和时,返回文件以获取校验和。但是当前代码中不存在整个“远程 rsync 返回到文件”方面,因此首先需要编写。

当您运行实际传输时,可以在传输过程中有效地完成第二步:传输没有差异的文件非常有效。因此, rsync 的默认行为就足够了。使用--dry-run最佳方法时,可能首先以默认行为运行 rsync,收集--dry-run输出,然后--checksum在第一次运行中找到的文件上再次运行 rsync。

于 2014-05-17T23:35:47.693 回答
4

简短的回答......确实如此。

same time and same size ► skip file (no transfer, no checksum)

良好且快速,但不准确,rsync 默认提供。该文件可以修改,时间/大小仍然相同。(时间可以重置)如果偏执,您可以使用 -c。

different sizes ► transfer file (no checksum)

简单化...如果它是一个 2 gig 文件怎么办...唯一的区别是最后有 1 行?校验和可以解决这个问题并节省网络流量。如果您信任时间/大小比较,则可以使用 -c。

different times and same size ► perform checksum ► transfer only if checksums differ

当然。


我没有看到它,但我记得 rsync 曾经有一个问题,如果超过了......我认为它大约有 130,000 个文件。也许这个问题已经解决了。
如果您在一个目录中确实有这么多文件,那么您可能会遇到更大的问题......将它们分散到不同的目录中并在这些多个目录上执行多个 rsync。
许多小文件(在大多数文件系统上)有很多内部碎片问题,你最好归档文件并重新同步归档......你需要一个允许更新归档而不是重新创建归档的归档器.

也许,如果不是很多这些文件都更新了……找到在某个日期之后更改的文件(查找 --newer 文件),然后仅对这些文件进行 rsync。(如果你相信时代)

为什么这个问题被忽略了这么久?

于 2013-12-12T04:54:42.120 回答