rsync 是验证目录是否相同的最快且最可靠的方法吗?

rsync 是验证目录是否相同的最快且最可靠的方法吗?

更新:再读一遍,我发现这不是一个好问题。我想我应该问类似的问题有多可靠rsync -aP --dry-run /origin /dest。当然,最可靠的方法并不是检查数据完整性的最快方法。

由于答案温和地解释了 rsync 对这些选项(以及一些失败场景)的作用,并从 diff 的作用中得知,我将保持这个问题不变。


问题是:我复制了一个340 GB的文件夹,我想检查复制是否成功。使用rsync -aP /origin /dest从一个 ext4 分区到另一个 ext4 分区的方式进行复制。

我知道使用diff -r /origin /dest比较源目录和目标目录会花费非常(非常非常)很长的时间。然后我想我可以用来rsync -aP --dry-run /origin /dest比较目录......然后它花了5秒(!)。 (我time在命令之前使用它来测量它。)

由于rsync -aP只显示了“发送增量文件列表”消息,没有其他内容(它会列出不同的文件或未复制的文件),我得出的结论是,这是检查两个目录是否相同的最快且最可靠的方法。 (只要rsync -a使用了选项,文件和目录在所有者、权限和修改时间方面也是相同的......-P意味着--progress。)

我对吗?rsync -aP --dry-run /origin /dest验证目录是否相同的最快、最可靠的方法是?

答案1

如果您使用 diff,它总是读取文件内容以找出其内容之间的任何差异。

默认情况下,如果两者之间的文件名、修改时间和文件大小相同,rsync 不会读取文件内容。如果它们相同,则假定文件内容相同并且不会费心读取它们。这将使在已经相同(或几乎相同)的目录上速度快几个数量级。

在大多数情况下,这种行为不是问题,因为文件在同步之前和之后都发生更改的情况非常罕见,两者都在同一个 1 秒窗口内,以便具有相同的修改时间,保持相同的文件大小。即使这种情况确实发生了,也很少会产生太大影响。

--ignore-times您可以使用命令行选项强制 rsync 始终读取文件内容,而不管修改时间(或大小)如何。

答案2

速度和可靠性常常是相反的要求。diff(或cmp)将逐位比较文件,这将给出最多的可靠的回答。 (diff -q如果您只想知道文件是否相同,请使用。)

为了使其更快,您必须跳过完整读取文件并依靠时间戳;或者跳过传输的数据,这在一个系统中可能不是一个大问题,因为磁盘 I/O 可能是限制速度的因素。

如果文件位于不同的系统上,并且您有md5sum或类似的系统,您可以执行类似的操作

cd /somewhere ; find . -type f | xargs -d '\n' md5sum > /tmp/checksums

两端,然后比较输出文件。这样你只需要传输哈希值,而不是整个数据。 (或者sha512sum如果您想要更强的检查)。rsync -c显然也内部使用MD5


仅检查时间戳和读取整个数据之间的选择还取决于假设的错误源是什么。检查元数据将判断复制过程是否在复制所有内容之前终止,但不会检查复制的实际数据。为了检测静默数据损坏,数据将绝对地需要完整读取,并比较完整数据或仅比较校验和。使用 rsync,rsync -i -c将输出校验和不匹配的文件列表,并再次复制它们。

相关内容