不足している部分を追加

不足している部分を追加

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の両方をちょうど必要なオフセット

元。

まずテスト ファイルを生成しましょう。説明のために 60GiB ではなく 60MiB を選択しました。

$ 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

ここで、両方のファイルの最初のxブロックをスキップして、origfileからにコピーします。newfile301M

$ 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コマンドを使用して 60 GB のファイルを と に分割file1できますfile2。次に、 を使用してcat必要な部分を元に戻します。

例:

split -n2 60Gfile
cat xab >> 30Gfile

split -n2ファイルを半分に分割し、2つのファイルを作成しますxaaxab

これで期待どおりに動作しない場合は、コマンドに他のオプションがあるため、split マニュアルをお読みください。

関連情報