在 Linux 中计算目录的 MD5 校验和
简介
在日常使用 Linux 的过程中,我们可能需要检查目录中的某个文件是否有任何更改。或者,我们可能想确认一个目录的内容与其他位置、磁盘或系统上的另一个目录的内容是否相同。在本教程中,我们将学习如何在 Linux 上计算整个目录树的 MD5 校验和。我们将计算所有目录内容的单个哈希值以进行比较。
获取目录树中所有文件的列表
要找出目录树中所有文件的哈希值,我们首先需要获取这些文件的列表。我们将使用 search 命令进行此操作。
让我们运行 tree 命令来查看示例目录结构 -
├──file1.png ├──folder1 │ ├── file2.jpg │ └── folder3 │ └── file3.txt └──folder2 └── file4.sh
如我们所见,我们在多个子目录中有文件。现在,我们可以使用类型为 F 的 research 命令来获取目录及其子目录中所有文件的列表,不包括文件夹和符号连接。
$ find . -type f ./folder2/file4.sh ./folder1/folder3/file3.txt ./folder1/file2.jpg ./file1.png
现在我们可以获取目录中所有文件的列表,以及运行单个命令的副目录。
排序 使用排序和"本地问题"
现在我们可以获取所有文件的列表,接下来的步骤是:-
对列表中的每个文件运行 md5sum 命令
创建一个包含文件路径及其哈希值的字符串
最后,对刚刚创建的字符串运行 md5sum 以获取单个哈希值
因此,如果目录中的任何内容发生变化,包括文件路径或文件列表,哈希值也会发生变化。但是这种方法存在一个问题。搜索命令默认不会对输出进行排序。为了提高效率,find 命令只会打印它在遍历文件系统时获得的各个结果。因此,顺序可能会因系统、位置甚至运行次数的不同而发生变化。因此,即使两个目录完全相同,哈希值也会发生变化。
我们可以通过使用 sort 命令对搜索结果进行排序来解决这个问题 -
$ 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
通过使用 Cale 标准进行排序操作,我们消除了排序问题。
总结
我们可以使用 find 命令的 -exec 参数对找到的每个文件运行 md5sum 命令 -
$ find . -type f -exec md5sum {} +
7d2186aaeed78b24f00f782f2346e5f9 ./folder2/file4.sh
d41d8cd98f00b204e9800998ecf8427e ./folder1/folder3/file3.txt
c6aa7ce9967680b77ea7e72d96949303 ./folder1/file2.jpg
46ffe26d56fe5164570ad43cc79b59d3 ./file1.png
我们使用花括号 ({}) 来指定 "filenames" 将作为参数传递给 md5sum 命令的位置。我们还在末尾添加了加号 (+),以便将文件作为参数传递给单个 md5sum 命令 (md5sum file1 file2 file3...),而不是为每个文件运行单独的 md5sum 进程。为了获得最终哈希值,我们可以创建包含所有文件路径和相应哈希值的字符串,然后将其传递给 md5sum 命令 -
$ $ find . -type f -exec md5sum {} + | md5sum
1d0e4d4ed4e4f3c3d0d9a3900b13f3e7 -
我们目录树的最终哈希值是 1d0e4d4ed4e4f3c3d0d9a3900b13f3e7。
总结
在本教程中,我们学习了如何在 Linux 上计算整个目录树的 MD5 校验和。我们使用 find 和 md5sum 命令列出目录及其子目录中的文件,并对输出进行排序以消除不同语言环境导致的问题。然后,我们使用 find 命令的 "-exec" 参数对找到的每个文件运行 md5sum 命令,最后创建一个包含所有文件路径及其哈希值的字符串,并将其传递给 md5sum 命令以获取目录树的最终哈希值。当我们想要验证文件的完整性和真实性时,这种方法非常有用。
相关文章
有用资源
linux 参考教程 - 该教程包含有关 linux 的更多信息:https://www.cainiaomax.com/linux/

