在 Unix 命令行上下文中,我想比较两个真正巨大的文件(每个文件大约 1TB),最好带有进度指示器。
我已经尝试过diff
和cmp
,它们都使系统崩溃(macOS Mojave),更不用说给我一个进度条了。
比较这些非常大的文件的最佳方法是什么?
额外细节:
我只是想检查它们是否相同。
cmp
以系统自行重新启动的方式使系统崩溃。 :-( 也许系统内存不足?
答案1
如果您想获取有关它们相同或不同这一事实的信息,一种可能的方法是使用哈希。这样的命令将为您提供sha1
文件的哈希值:
shasum file1 file2
预期结果类似于:
ddfdb3a7fc6fc7ca714c9e2930fa685136e90448 file1
ddfdb3a7fc6fc7ca714c9e2930fa685136e90448 file2
答案2
您可以用作pv
进度指示器,并将其通过管道传递给shasum
函数来检查哈希值以查看它们是否相同。
pv file1 | shasum
1.08MiB 0:00:00 [57.5MiB/s] [====================================>] 100%
303462e848ecbec5f8ab12718fa6239713eda1c6 -
pv file2 | shasum
1.08MiB 0:00:00 [57.5MiB/s] [====================================>] 100%
303462e848ecbec5f8ab12718fa6239713eda1c6 -
答案3
您可以通过从每个文件中删除几 GB、计时并适当扩展来估计总时间。进度条也必须计算字节数——它本身可能会将时间延长 50%。
事实上,您可以使用循环将文件分成 100 个部分(使用 dd 或 head -c + tail -c,带管道),使用您喜欢的比较工具,并报告每个部分。
优点:
(a) 以 1% 的间隔向您提供进度报告。
(b) 如果早期存在差异,您会更早得到答案,并且可以退出循环而不检查文件的其余部分。
(c) 比较 10GB 文件可能不会重新启动您的系统。
(d) 您可以对其进行调整,以对文件的已知区域进行更详细的分析:分而治之。
(e) 您可以将地址范围的部分分配给多个 CPU。