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

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

У меня есть файл loopback, который содержит одну файловую систему, назовем его fs.image. У меня есть другой, гораздо больший файл loopback, который содержит несколько разделов и несколько файловых систем, назовем его 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

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

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

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

$ 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

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