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

У меня есть файл на моем резервном диске, который является foo.txt (30 гибибайт).

У меня есть файл на моем обычном диске, который является foo.txt (60 гибибайт, первые 30 гибибайт, как гарантируют, будут точно тем же).

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

Возможно, что-то с dd работал бы?

0
задан 3 June 2018 в 18:12

3 ответа

Для синхронизации файлов есть rsync, у него есть опция --append для «добавления данных в более короткие файлы»:

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

Пример выполнения

Тестовый сценарий, грубо скопированный со стального привода ответ - я добавил опции -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
ответ дан 29 October 2019 в 04:57

Это огромный файл, но если он обрабатывает размер, вы можете использовать команду split, чтобы разбить файл размером 60 ГБ на file1 и file2. Затем используйте cat, чтобы собрать нужные части вместе.

Пример:

split -n2 60Gfile
cat xab >> 30Gfile

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

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

0
ответ дан 29 October 2019 в 04:57

Да можно использовать dd - прием должен выбрать обоих bs x skip и obs x 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, пропуск первого 30 x 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
$ 
2
ответ дан 29 October 2019 в 04:57

Другие вопросы по тегам:

Похожие вопросы: