高效的rsync

高效的rsync

5年后的现在这个问题最初有人问,有没有办法rsync执行以下操作?

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

就我而言,我有一个可通过多个操作系统访问的网络共享(一个使用 UTC,另一个使用 RTC - 我在任一操作系统上都没有管理员/根访问权限,因此无法更改它)。在一个操作系统中修改文件会更改时间,使其比“真实”时间提前/落后几个小时,具体取决于我浏览文件的操作系统。如果我修改文件,时间戳将是“不正确的”。

答案1

一方面,相关问题非常令人困惑。 9mjb的回答是正确的。

另一方面,如果您在网络文件系统的本地安装上使用 rsync,则无论如何它都无法在不下载整个文件的情况下对远程文件进行校验和!所以你会在这里陷入缓慢的境地。假设您的可用网络带宽小于磁盘速度。

但我也不明白你想解释什么关于时间的问题。如果您使用-a,它应该从源系统传输准确的时间。如果您不使用-a,它不会从源文件系统传输原始时间,因此无论如何,时间都不会与后续传输完全匹配。听起来你不想要-u行为,但是你可以不使用-u:-)。


rsync默认情况下是有效的。 (代价是“如果时间和大小都匹配,文件不同的可能性微不足道,我愿意冒不传输的风险”)。

[同步] 以其增量传输算法而闻名,该算法通过仅发送源文件与目标中现有文件之间的差异来减少通过网络发送的数据量。 Rsync 广泛用于备份和镜像,并作为日常使用的改进复制命令。

Rsync 使用“快速检查”算法(默认情况下)查找需要传输的文件,该算法查找大小或上次修改时间已更改的文件。

需要理解的重要一点是,rsync 增量传输算法和“快速检查”是分开的。

听起来您不想要 的行为--checksum--checksum禁用“快速检查”部分。在这种情况下,不要使用--checksum

-c,--校验和

这改变了 rsync 检查文件是否已更改并且需要传输的方式。如果没有此选项,rsync 将使用“快速检查”(默认情况下)检查发送方和接收方之间每个文件的大小和上次修改时间是否匹配。此选项更改此设置以比较具有匹配大小的每个文件的 128 位校验和。生成校验和意味着双方将花费大量磁盘 I/O 来读取传输中文件中的所有数据(这是在传输更改的文件时进行的任何读取之前),因此这可能会减慢速度显著地。

发送方在进行文件系统扫描以构建可用文件列表时生成校验和。接收方在扫描已更改的文件时生成其校验和,并对与相应发送方文件大小相同的任何文件进行校验和:选择大小或校验和已更改的文件进行传输。

请注意,rsync 始终通过检查文件传输时生成的整个文件校验和来验证每个传输的文件是否在接收端正确重建,但自动传输后验证与此选项无关。 before-the-transfer “此文件需要更新吗?”查看。

答案2

令人惊讶的是,使用内置 rsync 选项这看起来不可能!

这可能有效:

rsync -an --info=name src dest \
    | rsync -an --info=name --checksum --files-from - src dest

解释:

第一个 rsync 命令使用默认的 rsync 模式检查时间和大小。它输出具有不同时间或大小的任何目录或文件名。由于 -n 标志,不会传输任何文件。

第二个 rsync 命令从第一个 rsync 中获取时间或大小发生改变的文件列表,然后使用 --checksum 参数对这些文件再次运行 rsync。

第二个命令有 -n 表示试运行模式,因此只会打印文件名。从第二个命令中删除 -n 以实际传输文件。

相关内容