Copiar datos de un archivo a una ubicación específica de otro archivo con dd trunca el archivo de salida

Copiar datos de un archivo a una ubicación específica de otro archivo con dd trunca el archivo de salida

Tengo un archivo loopback que contiene un único sistema de archivos, llamémoslo fs.image. Tengo otro archivo loopback mucho más grande, que contiene múltiples particiones y múltiples sistemas de archivos, llamémoslo disk.image.

fs.imagees exactamente del mismo tamaño que una de las particiones en disk.image. Me gustaría copiar los datos en el disk.imagearchivo en la ubicación correcta.

Tengo un script que calcula el desplazamiento adecuado e intento hacerlo con dd. Supuse que esto funcionaría porque funciona con un dispositivo de bloque, pero no es así. disk.imagese trunca en la posición inmediatamente posterior a los datos que se acaban de escribir en él.

¿Hay alguna manera de evitar ddtruncar el archivo?

fs.imageestá comprimido como fs.image.bz2y el comando que estoy ejecutando es así:

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

¿Dónde $OFFSETestá mi compensación calculada?

He pensado en otras formas de lograr esto, pero esta parece la más simple (si funcionó). Una opción sería copiar los datos hasta el punto de inserción en otro archivo, agregar el sistema de archivos y finalmente agregar el resto del archivo original. Sin embargo, esto sería lento porque estaría copiando una gran cantidad de datos que realmente no necesito. Estoy abierto a otras opciones.

Respuesta1

GNU dd(al menos la versión 8.23) tiene lo siguientebandera de conversión

no truncado no truncar el archivo de salida

que hace exactamente lo que quieres; Aquí hay un pequeño ejemplo:

$ 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

información relacionada