追加缺少的部分

追加缺少的部分

我的備份磁碟機上有一個檔案foo.txt(30 GiB)。

我的常規驅動器上有一個檔案foo.txt(60 GiB,前 30 GiB 保證完全相同)。

如何只附加缺少的部分而不重新複製整個文件?

也許有什麼dd可以工作?

答案1

要同步文件rsync,它有一個--append選項“將資料附加到較短的文件上”:

rsync --append /path/to/foo.txt /path/to/foo.txt
#              ^- original      ^- copy

運行範例

測試場景公然複製 Steeldriver 的答案 - 我添加了-P-v詳細輸出選項。

$ dd if=/dev/urandom bs=1M iflag=fullblock count=60 of=origfile
60+0 records in
60+0 records out
62914560 bytes (63 MB, 60 MiB) copied, 0.328983 s, 191 MB/s
$ dd if=origfile bs=1M iflag=fullblock count=30 of=newfile
30+0 records in
30+0 records out
31457280 bytes (31 MB, 30 MiB) copied, 0.0292976 s, 1.1 GB/s
$ cmp origfile newfile
cmp: EOF on newfile
$ rsync -Pv --append origfile newfile
origfile
     62,914,560 100%  365.47MB/s    0:00:00 (xfr#1, to-chk=0/1)

sent 31,465,039 bytes  received 35 bytes  20,976,716.00 bytes/sec
total size is 62,914,560  speedup is 2.00
$ cmp origfile newfile
$ 

答案2

是的,你可以使用dd- 技巧是選擇bsxskipobsxseek等於精確的所需的偏移量

前任。

首先讓我們產生一個測試檔案 - 為了方便說明,我選擇了 60MiB 而不是 60GiB:

$ dd if=/dev/urandom bs=1M iflag=fullblock count=60 of=origfile
60+0 records in
60+0 records out
62914560 bytes (63 MB, 60 MiB) copied, 0.376846 s, 167 MB/s

現在讓我們準確地複製它的前半部分 - 再次使用dd(儘管這不是必需的)

$ dd if=origfile bs=1M iflag=fullblock count=30 of=newfile
30+0 records in
30+0 records out
31457280 bytes (31 MB, 30 MiB) copied, 0.063891 s, 492 MB/s

驗證它們是否不同:

$ cmp origfile newfile
cmp: EOF on newfile after byte 31457280, in line 122106

現在讓我們從origfileto複製,跳過兩個檔案的newfile30x區塊:1M

$ dd if=origfile bs=1M iflag=fullblock skip=30 count=30 of=newfile seek=30
30+0 records in
30+0 records out
31457280 bytes (31 MB, 30 MiB) copied, 0.0632964 s, 497 MB/s

最後,驗證文件現在是否相同:

$ cmp origfile newfile
$ 

答案3

這是一個巨大的文件,但如果它可以處理大小,您可以使用該split命令將 60GB 文件拆分為file1file2。然後用於cat將所需的部件重新組合在一起。

例子:

split -n2 60Gfile
cat xab >> 30Gfile

split -n2將文件分成兩半並產生 2 個文件,xaa稱為xab

如果這不能滿足您的要求,請閱讀拆分手冊,因為該命令還有其他選項。

相關內容