Contents

检查两个文件是否具有相同内容的最快方法

1. 概述

有时我们需要找出我们的 Linux 文件系统上是否有重复文件。 在这个简短的教程中,我们将探索几个工具来比较两个文件是否具有相同的内容。 我们还将对我们的工具进行基准测试以找到最快的。

2.基本比较

我们可以通过计算它们的哈希值来查看两个文件是否具有相同的内容。 让我们创建三个文件并将它们的 SHA1 哈希值与sha1sum 进行比较:

$ echo blogdemo > /tmp/file1
$ echo baeldunq > /tmp/file2
$ echo blogdemo > /tmp/file3
$ sha1sum /tmp/file1
3a5602d2d404f45f0d3d9591d41a74b6be59e507  /tmp/file1
$ sha1sum /tmp/file2
afd85322f7a10ed08177b4b03a33cf0fce5a0ef9  /tmp/file2
$ sha1sum /tmp/file3
3a5602d2d404f45f0d3d9591d41a74b6be59e507  /tmp/file3

正如我们所见,file1file3具有相同的内容,因为它们的哈希匹配,而file2不同。

3. 使用diff 进行比较

GNU *diff *可以逐行比较两个文件并报告所有差异。

我们可以使用标志*-sq运行diff*:

-q, --brief
    report only when files differ
-s, --report-identical-files
    report when two files are the same

让我们使用diff验证file1file2file3是否具有相同的内容:

$ diff -sq /tmp/file1 /tmp/file2
Files /tmp/file1 and /tmp/file2 differ
$ diff -sq /tmp/file1 /tmp/file3
Files /tmp/file1 and /tmp/file3 are identical

输出表明file1file3相同,file2内容不同。

4. 使用cmp 进行比较

GNU cmp 逐字节比较两个文件并打印第一个差异的位置。*我们可以通过-s标志来确定文件是否具有相同的内容。*

由于*-s*抑制了所有输出,我们应该echo 退出代码以了解结果。退出码 0 表示文件内容相同,1 表示内容不同:

$ cmp -s /tmp/file1 /tmp/file2
$ echo $?
1
$ cmp -s /tmp/file1 /tmp/file3
$ echo $?
0

由于file1file2的内容不同,cmp以状态 1 退出。$? 是一个特殊变量 ,始终保存最后一个命令的退出状态。如退出代码 0 所示,file1file3具有相同的内容。

5. 基准

要查看这些命令在大文件上的速度有多快,让我们使用dd 创建一个包含随机内容的大文件。我们需要在一个有很多空间的卷上尝试这个,因为这个例子消耗了 1GB:

$ dd if=/dev/urandom of=/tmp/file1 count=1K bs=1MB
1024+0 records in
1024+0 records out
1024000000 bytes (1.0 GB, 977 MiB) copied, 39.7297 s, 25.8 MB/s

接下来,我们将file1复制到file2,并将不同的字符附加到每个文件:

$ cp /tmp/file1 /tmp/file2
$ echo 1 >> /tmp/file1
$ echo 2 >> /tmp/file2

现在,我们将使用time命令来测量三个工具中的每一个所花费的时间:

$ time cmp -s /tmp/file1 /tmp/file2
cmp -s /tmp/file1 /tmp/file2  0.19s user 0.44s system 99% cpu 0.636 total
$ time diff -sq /tmp/file1 /tmp/file2
Files /tmp/file1 and /tmp/file2 differ
diff -sq /tmp/file1 /tmp/file2  0.20s user 0.44s system 99% cpu 0.640 total
$ time sha1sum /tmp/file1
f998e30863cbbe56bdd897997a79e333400a5369  /tmp/file1
sha1sum /tmp/file1  1.07s user 0.17s system 99% cpu 1.246 total
$ time sha1sum /tmp/file2
05cbc671d3d38102f4c90c01153a58aaacec69af  /tmp/file2
sha1sum /tmp/file2  1.10s user 0.14s system 49% cpu 2.481 total

**显然,cmp -sdiff -sq需要几乎相同的时间来验证两个文件是否具有相同的内容。**通过散列进行比较明显较慢。

我们应该注意,如果我们传递*-sq*标志,diff首先检查文件大小 ,如果大小不同,则会立即报告不匹配。

同样,如果我们将文件与其自身进行比较, diff -sq会立即报告匹配而不检查内容。这会产生非常快的结果。 命令cmp -s也执行这些预检查。