Files

如何分別校驗和大文件的每個“塊”

  • June 30, 2017

我在兩個硬碟驅動器上儲存了一些多 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

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