Shell-Script

md5 僅雜湊文件的前 512 個字節

  • May 11, 2020

背景

我即將將文件從舊 NAS 遷移到新 NAS,並希望驗證數據完整性。舊的 NAS (Debian) 使用 Linux Ext3 文件系統,而新的 (FreeNAS) 基於 ZFS。為了加快完整性驗證,我嘗試使用分類方法:

  • 首先驗證所有文件大小
  • 其次 md5 散列每個文件的前 512 個字節
  • 最後 md5 散列整個文件

這個想法是前兩個步驟將過濾掉明顯損壞的文件,並且比為 TB 文件批量執行 md5 更快地檢測到。

問題

我建構了一個 bash 命令,用於執行目錄結構的 md5 雜湊,並根據文件名對輸出進行排序,以確保我的 Linux NAS 上的確定順序。

#find somedir -type f -exec md5sum {} \; | sort -k 34;
12e761f96223145aa63f4f48f252d7fb  /somedir/foo.txt
18409feb00b6519c891c751fe2541fdc  /somedir/bar.txt

但是如果我只想 md5 每個文件的前 512 個字節,如何修改上面的內容?

您可以使用dd僅將前 512 個字節通過管道傳輸到md5sum. 但是,這將導致md5sum忘記文件名,因此另外-再次替換為文件名。

find . -type f -exec sh -c "dd if={} bs=512 count=1 2>/dev/null | md5sum | sed s\|-\|{}\|" \; | sort -k 34;

接受的答案對我不起作用。內部{}對於exec帶有特殊字元的文件失敗了。因此,我改為使用 GNU parallel(安裝其最新版本以使以下解決方案工作)。

使用parallel{}對於帶有特殊字元的文件不會出現異常行為。此外,parallel由於它將程序分佈在多個核心上,因此使整個過程更快。這對我有用parallel

find . -type f | parallel 'dd if={} bs=512 count=1 2>/dev/null | md5sum | tr -d "\n"; echo {};' | sort -k34;

引用自:https://unix.stackexchange.com/questions/266424