Добавить недостающую часть

Добавить недостающую часть

У меня на резервном диске есть файл размером foo.txt30 ГиБ.

У меня на обычном диске есть файл размером foo.txt60 ГиБ, первые 30 ГиБ гарантированно будут точно такими же).

Как можно добавить только отсутствующую часть, не копируя весь файл заново?

Может быть, что-то 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- трюк в том, чтобы выбрать оба bsx skipи obsx seekравнымиточныйтребуемое смещение

Бывший.

Сначала давайте сгенерируем тестовый файл — для наглядности я выбрал 60 МБ вместо 60 ГиБ:

$ 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

Теперь давайте скопируем из origfileв newfile, пропустив первые 30x 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команду для разделения файла размером 60 ГБ на file1и file2. Затем используйте , catчтобы соединить нужные вам части обратно.

Пример:

split -n2 60Gfile
cat xab >> 30Gfile

split -n2делит файл пополам и создает 2 файла с именами xaaиxab

Если это не дает желаемого результата, прочтите руководство по команде split, так как у нее есть и другие параметры.

Связанный контент