在 Linux 中计算目录的 MD5 校验和


简介

在我们日常使用 Linux 的过程中,我们可能需要检查目录中是否存在任何文件的更改。或者,我们可能需要确认一个目录的内容是否与另一个位于不同位置、磁盘或系统上的目录的内容相同。在本教程中,我们将学习如何在 Linux 上计算整个目录树的 MD5 校验和。我们将计算所有目录内容的单个哈希值以进行比较。

获取目录树中所有文件的列表

要找出目录树中所有文件的集合哈希值,我们首先需要获取这些文件的列表。我们将使用 find 命令进行此操作。

让我们运行 tree 命令以查看我们的示例目录结构:

├──file1.png
├──folder1
│  ├── file2.jpg
│  └── folder3
│      └── file3.txt
└──folder2
   └── file4.sh

如我们所见,我们在多个子目录中都有文件。现在我们可以使用 find 命令结合 -type f 选项来获取我们目录中所有文件的列表及其子目录,但不包括文件夹和符号链接:

$ find . -type f
./folder2/file4.sh
./folder1/folder3/file3.txt
./folder1/file2.jpg
./file1.png

现在我们可以通过运行单个命令来获取目录及其子目录中所有文件的列表。

使用 sort 命令和“区域设置”问题

现在我们可以获取所有文件的列表,我们的下一步是:

  • 对列表中的每个文件运行md5sum命令

  • 创建一个包含文件路径及其哈希值的字符串

  • 最后,对我们刚刚创建的此字符串运行md5sum以获取单个哈希值

因此,如果我们目录中的任何内容发生更改,包括文件路径或文件列表,哈希值也会发生更改。但是,这种方法存在一个问题。find 命令默认情况下不会对输出进行排序。为了提高效率,find 命令在遍历文件系统时仅打印它获得的各个结果。因此,在不同的系统、位置甚至不同的运行之间,顺序可能会发生变化。因此,即使两个目录完全相同,哈希值也会发生变化。

我们可以使用sort命令对 find 命令的结果进行排序来解决此问题:

$ find . -type f | sort
./file1.png
./folder1/file2.jpg
./folder1/folder3/file3.txt
./folder2/file4.sh

但我们仍然缺少一些东西。排序操作比看起来更复杂。字母、数字、日期以及它们应该如何排列可能会因地而异。这可能会更改驻留在具有不同区域设置的两个系统中的目录的结果。我们可以通过使用环境变量LC_ALL来解决此问题:

$ find . -type f | LC_ALL=C sort
./file1.png
./folder1/file2.jpg
./folder1/folder3/file3.txt
./folder2/file4.sh

通过对我们的排序操作使用C语言环境,我们消除了排序问题。

将它们组合在一起

我们可以使用 find 命令的-exec参数对 find 找到的每个文件运行md5sum命令:

$ find . -type f -exec md5sum {} +
7d2186aaeed78b24f00f782f2346e5f9 ./folder2/file4.sh
d41d8cd98f00b204e9800998ecf8427e ./folder1/folder3/file3.txt
c6aa7ce9967680b77ea7e72d96949303 ./folder1/file2.jpg
46ffe26d56fe5164570ad43cc79b59d3 ./file1.png

我们使用花括号({})来指定将把“文件名”作为参数传递给 md5sum 命令的位置。我们还在末尾添加了加号(+),以便将我们的文件作为参数传递给单个 md5sum 命令(md5sum file1 file2 file3...),而不是为每个文件运行单独的md5sum进程。要获取最终哈希值,我们可以创建包含所有文件路径和相应哈希值的字符串,然后将其传递给md5sum命令:

$ $ find . -type f -exec md5sum {} + | md5sum
1d0e4d4ed4e4f3c3d0d9a3900b13f3e7  -

我们目录树的最终哈希值为 1d0e4d4ed4e4f3c3d0d9a3900b13f3e7。

结论

在本教程中,我们学习了如何在 Linux 上计算整个目录树的 MD5校验和。我们使用 find 和md5sum命令列出目录及其子目录中的文件,并对输出进行排序以消除不同语言环境引起的问题。然后,我们使用 find 命令的“-exec”参数对找到的每个文件运行 md5sum 命令,最后创建包含所有文件路径及其哈希值的字符串,并将其传递给 md5sum 命令以获取目录树的最终哈希值。这种方法在我们需要验证文件完整性和真实性的情况下非常有用。

更新于: 2023年1月20日

3K+ 浏览量

开启你的职业生涯

通过完成课程获得认证

开始学习
广告