我将一个大目录从一个卷复制到另一个卷(使用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_dir
和dest_dir
首先跨越整个目录树和单独的子目录,一个接一个 - 示例目录包含 88,163 个文件,大小为 849.15 GB,是最大的目录;具体来说,它是照片应用程序的原始目录的目录结构。 (resource/renders/) 中的类似目录包含 21,700 个文件,大小为 27.25 GB,并且一次性进行比较,没有报告任何差异
diff
报告不相同的文件shasum
是不同的文件,即报告不同的文件与报告的shasum
文件不一样diff
- 下面是我的脚本中的两行,我在其中构建了 shasum 并将它们写入外部文件(以及 stdout)。
$1
和$2
显然是orig_dir
和dest_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..."
- 值得一提的是,脚本与
shasum
88k+ 以上文件(和 850 GB)的比较大约需要 21.5 小时才能完成。我还没有测量使用所花费的时间diff
。 - 所有的
diff
比较diff -r
(所以我比较的各个块)都成功完成。因此两个目录树看起来是相同的。
运行大型文件集时是否diff
存在问题(无论是文件数量还是文件大小)?或者,什么可能导致所谓的差异?