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