Data-Recovery

是否有 diff/merge 實用程序來比較二進製文件並根據二進制數據的差異在任一方向上逐位同步數據?

  • February 8, 2011

我有一個棘手的難題。我在兩個不同的目標驅動器上有一些文件,從同一個源驅動器複製。源驅動器出現故障,因此我使用 dd 將數據複製到一個目標(使用選項conv=noerror,sync將錯誤塊填充為零字節),並在同一源驅動器上使用 ddrescue 將數據複製到第二個分區,並且我聽說 ddrescue 也用零字節填充錯誤。

現在,我有兩個目標驅動器的數據幾乎重複,除了這兩個目標驅動器上的某些數據肯定不同。我只能假設差異將由那些零字節引起,這些零字節似乎位於這兩個目標驅動器上的數據中的不同位置。我只能假設這些差異是由在復製過程中遇到錯誤的文件中被填零的部分引起的。但是,兩個單獨的目標驅動器上的零填充點是不同的。大多數數據由二進製文件組成。因此,源上的某些文件是完全完整的,而目標上的對應文件則不是,而目標上的其他文件是完全完整的,而源上的對應文件則不是。

理想情況下,我想按如下方式同步兩個驅動器:

  • 逐位比較每個文件。
  • 如果左側文件位為 1,右側文件位為 0,則將 1 複製到右側。
  • 如果左側文件的位為 0,而右側文件的位為 1,則將該 1 複製到左側,或者至少將 1 保留在右側,如果雙向同步不是一個選項。

這個功能對我來說很有意義,但是有沒有可以自動處理這個功能的實用程序?我考慮過為此使用 rsync,但似乎 rsync 僅根據大小和時間戳或校驗和檢查文件,而不是逐位檢查文件,簡單的校驗和不會告訴你應該在哪裡有 0為 1s。我還研究了 rdiff 和 bsdiff,它們都支持二進製文件,但它們似乎都只是輸出一個 diff 文件,而不是進行任何實際的複制/同步。

那麼,是否有一個實用程序可以滿足我的需求,正如我在上面描述的理想同步行為中所描述的那樣?作業系統不一定重要,因為我可以訪問 OSX、Windows 和 Ubuntu。

聽起來你想要的幾乎是一個工具,它將檢索兩個文件的每個塊,然後對每個塊執行按位或,並將輸出發送到一個新文件。

虛擬碼可能如下所示。相同的位不會發生任何事情,並且位不同的位將被設置為 1。

while not end-of-files:
 read block file_a
 read block file_b
 merged_block = file_a bitwise_or file_b
 write merged_block to file_c

Rsync 應該讓你做一種方式同步。我相信它也有一個檢查選項,告訴你文件是否不同。

引用自:https://serverfault.com/questions/232767