大檔案的 md5sum

大檔案的 md5sum

情境:

md5sum我有一個大型 TB 驅動器,其中包含各種類型的大型媒體檔案、ISO 映像檔等。

您可以建立這樣的總和:

FILE=four_gig_file.iso
SUM=$(head -c 1M "$FILE" | md5sum)
printf "%s *%s\n" ${SUM%-} "$FILE" >>test.md5

由於第一個兆位元組的簽名與整個文件的簽名不同,您將如何驗證這一點?

我見過用其他語言完成此操作,但我想知道如何用重擊。我嘗試過md5sum -c涉及管道之類的各種排列。


md5sum -c您是否必須將雜湊值重新計算到新文件中,然後對它們進行“比較”,而不是使用?

您可以使用

find /directory/path/ -type f -print0 | xargs -0 md5sum blah blah

處理大量文件。

附:Rsync 不是一個選項

更新2:就目前情況而言—

使用 head、find 和 md5sum;然後,我們可以相當快地從來源目錄建立一個文件,然後在計算目標目錄後使用另一端的 diff 檢查它。有沒有巧妙的台詞或腳本可以實現這一點?

答案1

僅透過對檔案的第一個兆位元組進行取樣來驗證內容可能無法偵測某些較大的檔案是否已以某種方式損壞、損壞或變更。原因是您只向雜湊演算法提供一兆位元組的數據,而可能還有數百兆位元組的數據可能會被關閉。即使有一位出現在錯誤的位置也會產生不同的簽名。

如果您想要驗證資料完整性,那麼最好使用 CRC32 演算法。它比 MD5 更快。儘管可以偽造/修改文件以使其看起來具有正確的 CRC32 簽名,但隨機的損壞位不太可能做到這一點。

更新:

這是一個很好的單行程式碼,用於對每個檔案執行基於 1 MB 的 md5 校驗和:

find ./ -type f -print0 | xargs -0 -n1 -I{} sh -c "echo '{}' >> output.md5 && head -c 1M '{}' | md5sum >> output.md5"

如果您願意,可以將 md5sum 替換為 cksum。請注意,我選擇在輸出中包含檔案名稱。這是因為當您不提供整個檔案的 md5sum 時,檔案名稱字串不會被傳遞。

答案2

稍微修改的解決方案/範例,使用 find -size 參數僅限制大於 10M 的文件,並從文件的前 1M 和最後 1M 部分計算 md5sum。

find . -type f -a -size +10M -print0 | xargs -0 -n1 -I{} sh -c 'echo "$( (head -c 1M '{}'; tail -c 1M '{}' ) | md5sum) {} "'

相關內容