Копирование данных из файла в определенное место другого файла с помощью dd усекает выходной файл

У меня есть петлевой файл, который содержит одну файловую систему, давайте назовем его fs.image, У меня есть другой, намного больший файл обратной петли, который содержит несколько разделов и несколько файловых систем, давайте назовем его disk.image,

fs.image точно такой же размер, как один из разделов в disk.image, Я хотел бы скопировать данные из него в disk.image файл в правильном месте.

У меня есть скрипт, который вычисляет правильное смещение, и пытается сделать это с dd, Я предполагал, что это будет работать, потому что это работает с блочным устройством, но это не так. disk.image усекается в позиции, следующей сразу за только что записанными данными.

Есть ли способ сохранить dd от усечения файла?

fs.image сжимается как fs.image.bz2 и команда, которую я выполняю, выглядит следующим образом:

bzcat fs.image.bz2 | dd of=disk.image bs=4M seek=$OFFSET

где $OFFSET мое вычисленное смещение.

Я думал о других способах достижения этого, но это кажется самым простым (если это сработало). Однажды можно будет скопировать данные до точки вставки в другой файл, добавить файловую систему и, наконец, добавить оставшуюся часть исходного файла. Однако это будет медленно, потому что я буду копировать много данных, которые мне не нужны. Я открыт для других вариантов.

1 ответ

Решение

ГНУ dd (по крайней мере, версия 8.23) имеет следующий флаг преобразования

notrunc не обрезать выходной файл

который делает именно то, что вы хотите; Вот небольшой пример:

$ cat foo
foobar
$ echo -n XX | dd of=foo bs=1c seek=1 conv=notrunc
2+0 records in
2+0 records out
2 bytes (2 B) copied, 0.000283698 s, 7.0 kB/s
$ cat foo
fXXbar
Другие вопросы по тегам