在 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 命令以獲取目錄樹的最終雜湊值。這種方法在我們需要驗證檔案完整性和真實性的情況下非常有用。