Syl*_*ain 25 size time rsync checksum skip
有一堆关于rsync校验和的线程,但似乎都没有解决这个需求,这将是最有效和最快速的同步方式,至少在我的情况下:
我注意到--checksum,如果有很多文件,该选项可能需要很长时间来镜像文件夹.单独使用此选项将对每个文件运行校验和,这非常安全但非常慢.此外,它会引起读访问开销以计算校验和.
选项--ignore-times不是我想要的,如果时间和大小都匹配,文件不同的可能性是微不足道的,我愿意承担不转移的风险.
该选项--size-only是不完整的,因为具有相同大小但不同时间的文件很可能实际上是不同的文件(例如,在另一个文件中更改char可能不会影响大小,只影响编辑时间).
有没有办法按照上面的组合执行镜像,使用rsync(我在机器人页面中遗漏了什么)或使用任何其他Linux工具?
谢谢.
小智 19
在确定是否传输文件(或使用--dry-run,是否列出文件)时,rsync将始终传输文件大小不同的文件.但是,当文件大小相同时,rsync有几个选项:
--size-only:从不传输文件--ignore-times:始终传输文件--checksum:计算校验和并传输文件(如果它们不同)您想要的行为将是最后两个的组合:"如果时间戳不同,如果校验和也不同,则计算校验和并传输文件".目前这不是rsync中的一个选项.
不幸的是,查看rsync源代码,看起来添加此功能并非易事.目前,如果使用校验和,则远程rsync将收集大小,时间戳和校验和信息,并将它们一起发送.所需的行为将要求远程rsync首先通过大小和时间戳发送,并且当本地rsync确定需要校验和时,返回到文件以获取校验和.但是整个"远程rsync返回到文件"方面在当前代码中不存在,并且首先需要编写.
当您运行实际传输时,第二步可以在传输过程中有效地完成:传输没有差异的文件非常有效.那么rsync的默认行为就足够了.使用--dry-run最佳方法时,可能首先使用默认行为运行rsync,收集--dry-run输出,然后再次运行rsync --checksum,对第一次运行中找到的文件执行.
简短的答案...确实如此。
same time and same size ? skip file (no transfer, no checksum)
Run Code Online (Sandbox Code Playgroud)
好又快,但不确切,rsync默认提供该功能。可以修改文件,并且时间/大小仍然相同。(时间可以重设)如果偏执,可以使用-c。
different sizes ? transfer file (no checksum)
Run Code Online (Sandbox Code Playgroud)
简单化...如果它是2 gig文件怎么办...而唯一的区别是最后一行是1行?校验和可以计算出并节省网络流量。如果您信任时间/大小比较,则可以使用-c。
different times and same size ? perform checksum ? transfer only if checksums differ
Run Code Online (Sandbox Code Playgroud)
当然。
我没有看到它,但是我记得rsync曾经有个问题,如果超过了……我认为大约有130,000个文件。也许该问题已解决。
如果在一个目录中确实有那么多文件,则可能会遇到更大的问题……将它们分散到不同的目录中,并对这些多个目录执行多个rsync。
许多小文件(在大多数文件系统上)有很多内部碎片问题,您最好将文件存档并重新同步档案...您需要一个允许更新档案而不是一直重新创建档案的档案器。
也许,如果没有很多这些文件被更新……找到一个在日期之后更改的文件(查找--newer文件),然后仅对那些文件进行rsync。(如果您相信时代)
为什么这个问题被忽视这么久?