Shell-Script
md5 僅雜湊文件的前 512 個字節
背景
我即將將文件從舊 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
帶有特殊字元的文件失敗了。因此,我改為使用 GNUparallel
(安裝其最新版本以使以下解決方案工作)。使用
parallel
,{}
對於帶有特殊字元的文件不會出現異常行為。此外,parallel
由於它將程序分佈在多個核心上,因此使整個過程更快。這對我有用parallel
:find . -type f | parallel 'dd if={} bs=512 count=1 2>/dev/null | md5sum | tr -d "\n"; echo {};' | sort -k34;