兩個相似的大原始二進製文件的差異
假設
abc
我的本地電腦上有一個 4 GB 的文件。我已經通過 SFTP 將它上傳到遠端伺服器,花了幾個小時。現在我在本地稍微修改了文件(可能最大 50 MB,但不是此文件中的連續字節),並將其保存到
abc2
. 我還將原始文件保存在abc
本地電腦上。如何計算
abc
和的二進制差異abc2
?應用:
- 我只能將
patch
文件(可能最大 100MB)發送到遠端伺服器,而不是重新上傳整個abc2
文件(再次需要幾個小時!),並且僅abc2
在遠端伺服器上重新創建。abc``patch
- 在本地,我可以只保存+ ,而不是浪費 8 GB 來備份
abc
和,所以它只需要 < 4100 MB。abc2``abc``patch
這該怎麼做?
PS:對於文本,我知道
diff
,但在這裡我正在尋找適用於任何原始二進制格式的東西,它可以是 zip 文件或執行檔,甚至是其他類型的文件。PS2:如果可能,我不想使用
rsync
; 我知道它可以以有效的方式在兩台電腦之間複製更改(而不是重新發送未更改的數據),但是在這裡我真的想要一個patch
文件,如果我同時擁有abc
和patch
.
對於第二個應用程序/問題,我會使用類似
restic
or的重複數據刪除備份程序borgbackup
,而不是嘗試手動跟踪“更新檔”或差異。restic
備份程序允許您將目錄從多台機器備份到同一個備份儲存庫,在單個機器的文件片段之間以及機器之間對備份數據進行重複數據刪除。(我沒有使用 的使用者經驗borgbackup
,所以我對該程序無話可說。)計算和儲存
abc
和abc2
文件的差異可以用rsync
.這是一個153 MB
abc
的範例。abc2
該文件abc2
已通過使用其他一些數據覆蓋文件的前 2.3 MB 進行了修改:$ ls -lh total 626208 -rw-r--r-- 1 kk wheel 153M Feb 3 16:55 abc -rw-r--r-- 1 kk wheel 153M Feb 3 17:02 abc2
我們創建了用於轉換的更新檔
abc
並將abc2
其命名為abc-diff
:$ rsync --only-write-batch=abc-diff abc2 abc
$ ls -lh total 631026 -rw-r--r-- 1 kk wheel 153M Feb 3 16:55 abc -rw------- 1 kk wheel 2.3M Feb 3 17:03 abc-diff -rwx------ 1 kk wheel 38B Feb 3 17:03 abc-diff.sh -rw-r--r-- 1 kk wheel 153M Feb 3 17:02 abc2
生成的文件
abc-diff
是實際的差異(您的“更新檔文件”),同時是為您創建abc-diff.sh
的簡短 shell 腳本:rsync
$ cat abc-diff.sh rsync --read-batch=abc-diff ${1:-abc}
給定文件,此腳本會進行修改
abc
,使其變得與 相同:abc2``abc-diff
$ md5sum abc abc2 be00efe0a7a7d3b793e70e466cbc53c6 abc 3decbde2d3a87f3d954ccee9d60f249b abc2 $ sh abc-diff.sh $ md5sum abc abc2 3decbde2d3a87f3d954ccee9d60f249b abc 3decbde2d3a87f3d954ccee9d60f249b abc2
該文件
abc-diff
現在可以轉移到您擁有的任何其他地方abc
。使用該命令rsync --read-batch=abc-diff abc
,您可以將更新檔應用於文件,將其內容轉換為與您創建差異的系統上abc
的文件相同。abc2
第二次重新應用更新檔似乎是安全的。沒有錯誤消息,文件內容也沒有改變(MD5 校驗和沒有改變)。
請注意,除非您創建明確的“反向更新檔”,否則無法輕鬆撤消更新檔的應用。
我還測試了將 2.3 MB 的修改寫入數據中的其他位置
abc2
,更遠一點(大約 50 MB),以及在開始時。生成的“更新檔”大小為 4.6 MB,這表明更新檔中僅儲存了修改後的位。