在Linux中计算一个目录的MD5校验和
介绍
在我们日常使用Linux的过程中,我们可能想检查一个目录中的任何文件是否有任何变化。或者我们可能想确认一个目录的内容与不同位置、磁盘或系统上的另一个目录的内容是一样的。在本教程中,我们将学习如何计算Linux上整个目录树的MD5校验和。我们将计算出所有目录内容的单一哈希值,用于比较。
获取一个目录树中所有文件的列表
为了找出一个目录树中所有文件的集体哈希值,我们首先需要得到这些文件的列表。我们将使用搜索命令进行这项活动。
让我们运行树状命令来看看我们的目录结构示例 —
├──file1.png
├──folder1
│ ├── file2.jpg
│ └── folder3
│ └── file3.txt
└──folder2
└── file4.sh
正如我们所见,我们在多个子目录中都有文件。现在我们可以使用类型为F主题的研究命令来获得我们目录中的所有文件及其子目录的列表,不包括文件夹和符号连接——。
$ find . -type f
./folder2/file4.sh
./folder1/folder3/file3.txt
./folder1/file2.jpg
./file1.png
现在我们可以得到一个目录中所有文件的列表,以及它的副主任运行一个命令的情况。
分拣 使用分拣和 “局部问题”
现在我们可以得到一个所有文件的列表,我们的下一步是–
- 对该列表中的每个文件运行md5sum命令
-
创建一个包含文件路径及其散列值的字符串。
-
最后,对我们刚刚创建的这个字符串运行md5sum,得到一个单一的哈希值
因此,如果我们目录中的任何东西发生变化,包括文件路径或文件列表,哈希值也会发生变化。但是,我们对这种方法有一个问题。搜索命令默认不会对输出进行排序。为了提高效率,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
通过在我们的分拣操作中使用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
我们使用大括号({})来指定 “文件名 “将作为参数传递给md5sum命令的位置。我们还在末尾添加了加号(+),这样我们的文件就会作为参数传递给一个md5sum命令(md5sum file1 file2 file3…),而不是为每个文件运行单独的md5sum进程。为了得到最终的哈希值,我们可以创建一个包含所有文件路径和相应哈希值的字符串,然后把它传给md5sum命令–
$ $ find . -type f -exec md5sum {} + | md5sum
1d0e4d4ed4e4f3c3d0d9a3900b13f3e7 -
我们目录树的最终散列值是1d0e4d4ed4e4f3c3d0d9a3900b13f3e7。
结论
在本教程中,我们学习了如何在Linux上计算整个目录树的MD5校验和。我们使用find和md5sum命令来列出一个目录及其子目录中的文件,对输出进行排序,以消除由不同区域划分引起的问题。然后,我们使用find命令的”-exec “参数对找到的每个文件运行md5sum命令,最后,创建一个包含所有文件路径及其哈希值的字符串,并将其传递给md5sum命令以获得目录树的最终哈希值。这种方法在我们想要验证文件的完整性和真实性的情况下是非常有用的。