Files
如何分別校驗和大文件的每個“塊”
我在兩個硬碟驅動器上儲存了一些多 GB 的文件。在離線儲存幾年後(不幸的是,情況遠非理想),我經常得到一些帶有 bit-rot 的文件(兩個副本不同),並想恢復文件。問題是,這些文件太大了,以至於在同一個文件中,在某些儲存設備上,一個位會損壞,而在另一個儲存設備上,另一個位會損壞,因此兩個磁碟都不包含未損壞的文件。
因此,我不想計算整個文件的 MD5 校驗和,而是想計算每個 1KB 塊的這些校驗和。有了這麼小的塊,相同的 1KB 塊在兩個硬碟驅動器上損壞的可能性要小得多。
如何才能做到這一點?我相信這應該不難,但我花了一個多小時嘗試不同的方法,但一直失敗。
我在這裡並沒有提供完整的解決方案,而是希望能夠指導您建構自己的解決方案。我個人認為有更好的工具,例如
rsync
,但這似乎不符合您問題中的標準。我真的不會使用
split
,因為這要求您能夠儲存拆分數據以及原始數據。相反,我會使用dd
. 類似這種方法的方法可能對您有所幫助。file=/path/to/file blocksize=1024 # Bytes per block numbytes=$(stat -c '%s' "$file") numblocks=$((numbytes / blocksize)) [[ $((numblocks * blocksize)) -lt $numbytes ]] && : $((numblocks++)) blockno=0 while [[ $blockno -lt $numblocks ]] do md5sum=$(dd bs=$blocksize count=1 skip=$blockno if="$file" 2>/dev/null | md5sum) # Do something with the $md5sum for block $blockno # Here we write to stdout echo "$blockno $md5sum" : $((blockno++)) done