强制rsync逐字节而不是校验和比较本地文件

时间:2017-05-14 16:31:39

标签: linux bash shell backup rsync

我写了一个Bash脚本来备份文件夹。脚本的核心是rsync指令

rsync -abh --checksum /path/to/source /path/to/target

我正在使用--checksum因为我既不想依赖文件大小也不想修改时间来确定是否需要备份源路径中的文件。但是,大多数 - 如果不是全部 - 我在本地运行此脚本,即连接了包含备份目标文件夹的外部USB驱动器;无网络备份。因此,不需要增量传输,因为两个文件将完全由同一台机器读取和处理。在这种情况下,计算校验和甚至会降低速度。如果rsync只是diff文件,如果它们都存储在本地,那会更好。

在阅读了联机帮助页后,我偶然发现了--whole-file选项,这似乎避免了昂贵的校验和计算。该联机帮助页还指出,如果源和目标是本地路径,则这是默认值。

所以我想将rsync语句改为

rsync -abh /path/to/source /path/to/target

rsync现在会逐字节检查本地源文件和目标文件,还是会使用修改时间和/或大小来确定是否需要备份源文件?我肯定想要依赖文件大小或修改时间来决定是否应该进行备份。

更新

请注意-b指令中的rsync选项。这意味着目标文件将在替换之前进行备份。因此,盲目 rsync来源文件夹中的所有文件,例如,通过提供评论中建议的--ignore-times,不是一种选择。它会创建太多重复文件并浪费存储空间。还要记住,我正在尝试减少本地计算机上的备份时间和工作负载。只备份一切都会破坏这个目的。

所以我的问题可以改为:rsync是否能够逐字节地进行文件比较?

1 个答案:

答案 0 :(得分:1)

没有办法按照你期望的方式对文件进行逐字节比较而不是校验和。

rsync的工作方式是创建两个进程,发送方和接收方,创建文件列表及其元数据,以便相互决定哪些文件需要更新。即使在本地文件的情况下也会这样做,但在这种情况下,进程可以通过管道进行通信,而不是通过网络套接字进行通信。确定更改文件列表后,更改将作为增量或整个文件发送。

理论上,人们可以将文件列表中的整个文件发送到另一个文件以进行差异,但实际上在许多情况下这将是相当低效的。接收方需要将这些文件保留在内存中,以防它检测到需要更新文件,否则需要重新发送文件中的更改。这里任何可能的解决方案听起来都不是很有效。

rsync {{1}}的{​​理论}机制有一个很好的概述:https://rsync.samba.org/how-rsync-works.html