diff 的可靠性如何?

diff 的可靠性如何?

我将一个大目录从一个卷复制到另一个卷(使用rsync),随后想检查副本是否确实正确,以验证数据的完整性。为了避免冗长的文件比较,diff我编写了一个小脚本,比较原始位置和目标位置的每个文件的 SHA 总和。然后,我比较了两者,并将不同的文件写入另一个脚本文件以再次复制。我选择了 SHA 总和,因为我不需要关心复制的文件在哪里不同,只需要它们不同。

运行脚本后,我对大量据称不同的文件感到有些震惊。因此,我查看了其中的一些样本并进行了比较,但发现内容或元数据均无差异。从表面上看,原始位置和目标位置的相同文件生成的校验和不同。尽管生成两个位置的校验和的代码相同,但情况并非如此。我不知道为什么这会失败并为相同的文件生成不同的 SHA 和。

所以我恢复了diff,并diff -r orig_dir dest_dir在原始位置和目标位置之间进行了比较。这也产生了一个据称不同的文件列表。同样,当我抽查其中几个文件时,我没有发现任何差异。

然后我恢复运行,在一个较小的位置子集上运行diff,结果没有发现任何差异。我现在逐个子目录运行命令,虽然操作冗长,但到目前为止没有发现不匹配的情况。

如果这能有所帮助,并能让我了解我正在查看的大小,最大的目录之一如下所示。我遇到的子集diff(没有产生差异列表)是目录 0、1、2、3、4 等。因此,一次比较 ~5,500 个文件似乎效果很好,但比较 88,000+ 个文件则不行:

dir1 ; 88,163 files, 849.15 GB
 |
 +-- 0 ; 5,482 files, 45.42 GB
 +-- 1 ; 5,493 files, 48.14 GB
 +-- 2 ; 5,485 files, 49.54 GB
 +-- 3 ; 5,633 files, 50.54 GB
 +-- 4 ; 5,387 files, 47.82 GB
 +-- 5 ; 5,408 files, 42.77 GB
 +-- 6 ; 5,508 files, 49.36 GB
 +-- 7 ; 5,469 files, 55.51 GB
 +-- 8 ; 5,592 files, 51.52 GB
 +-- 9 ; 5,472 files, 50.93 GB
 +-- A ; 5,507 files, 99.18 GB
 +-- B ; 5,618 files, 55.74 GB
 +-- C ; 5,503 files, 47.87 GB
 +-- D ; 5,537 files, 52.63 GB
 +-- E ; 5,582 files, 53.62 GB
 +-- F ; 5,487 files, 48.56 GB

一些可能重要的细节:

  • 系统为 macOS 13.3.1 (a)(撰写本文时的最新修订版)
  • arm64 CPU(在 Mac Studio 上运行的 Apple M1 Max)
  • Darwin 内核版本 22.4.0
  • 原始卷文件系统为 HFS+(通过 USB-3 连接);目标卷文件系统为 APFS(通过 Firewire 800 连接)
  • 唯一使用的diff命令实际上只是diff -r orig_dir dest_dir使用orig_dirdest_dir首先跨越整个目录树和单独的子目录,一个接一个
  • 示例目录包含 88,163 个文件,大小为 849.15 GB,是最大的目录;具体来说,它是照片应用程序的原始目录的目录结构。 (resource/renders/) 中的类似目录包含 21,700 个文件,大小为 27.25 GB,并且一次性进行比较,没有报告任何差异
  • diff报告不相同的文件shasum是不同的文件,即报告不同的文件与报告的shasum文件不一样diff
  • 下面是我的脚本中的两行,我在其中构建了 shasum 并将它们写入外部文件(以及 stdout)。$1$2显然是orig_dirdest_dir$sha_file_list1$sha_file_list2是保存 shasum 名称及其对应文件及其完整路径的变量。
echo "starting: find files and their SHA sums in $1"
find "$1" -type f -exec shasum {} \; | sort -k 2 | tee "$sha_file_list1" | pv -i 1 -s $(find "$1" -type f | tr -cd '\0' | wc -c) -N "Processing files..."
echo "starting: find files and their SHA sums in $2"
find "$2" -type f -exec shasum {} \; | sort -k 2 | tee "$sha_file_list2" | pv -i 1 -s $(find "$2" -type f | tr -cd '\0' | wc -c) -N "Processing files..."
  • 值得一提的是,脚本与shasum88k+ 以上文件(和 850 GB)的比较大约需要 21.5 小时才能完成。我还没有测量使用所花费的时间diff
  • 所有的diff比较diff -r(所以我比较的各个块)都成功完成。因此两个目录树看起来是相同的。

运行大型文件集时是否diff存在问题(无论是文件数量还是文件大小)?或者,什么可能导致所谓的差异?

相关内容