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

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

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

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

阅读完手册后,我偶然发现–whole-file选项,这似乎避免了昂贵的校验和计算.该手册页还指出,如果源和目标是本地路径,则这是认设置.

所以我正在考虑将我的rsync语句更改为

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

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

更新

注意rsync指令中的-b选项.这意味着将在替换目标文件之前对其进行备份.因此,不能盲目地同步源文件夹中的所有文件,例如通过提供注释中建议的–ignore-times来同步.它将创建过多的重复文件并浪费存储空间.还请记住,我正在尝试减少本地计算机上的备份时间和工作量.仅备份所有内容都会破坏该目的.

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

解决方法:

没有办法像您期望的那样对文件进行逐字节比较,而不是校验和.

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

从理论上讲,一个文件可以将文件列表中的整个文件发送给另一个文件,以进行比较,但是实际上,这在许多情况下效率很低.如果接收器检测到需要更新文件,否则接收器将需要将这些文件保留在内存中,否则需要重新发送文件中的更改.这里的任何可能的解决方案听起来都不是很有效.

关于rsync的(理论)机制有很好的概述:https://rsync.samba.org/how-rsync-works.html

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...