У меня на резервном диске есть файл размером foo.txt
30 ГиБ.
У меня на обычном диске есть файл размером foo.txt
60 ГиБ, первые 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
- трюк в том, чтобы выбрать оба 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
$
решение3
Это огромный файл, но если он справляется с таким размером, вы можете использовать split
команду для разделения файла размером 60 ГБ на file1
и file2
. Затем используйте , cat
чтобы соединить нужные вам части обратно.
Пример:
split -n2 60Gfile
cat xab >> 30Gfile
split -n2
делит файл пополам и создает 2 файла с именами xaa
иxab
Если это не дает желаемого результата, прочтите руководство по команде split, так как у нее есть и другие параметры.