dd: ¿cómo extraer una subsección de un archivo con 2 desplazamientos?

dd: ¿cómo extraer una subsección de un archivo con 2 desplazamientos?

Tengo un archivo que quiero donde el desplazamiento del byte inicial es 3020852 y el desplazamiento del byte final es 13973824.

Hay alguna variación de este comando: dd ibs=X obs=Y skip=1 count=1que aún no tengo funcionando.

Respuesta1

Hay varias maneras de hacer esto, como puedes leer enesta pregunta similar. Te daré el head | tailenfoque (en mi opinión, el más "idiomático") y el ddenfoque.

head --bytes=<end_offset> in_file.bin | tail --bytes=<end_offset - start_offset> > out_file.bin

Alternativamente:

dd bs=1 skip=<start_offset> count=<end_offset - start_offset> < in_file > out_file.bin

Respuesta2

Con la ayuda de @agtoever y @tom-yan esta es la forma más rápida de lograrlo:

dd if=somefile of=somefile2 skip=$start_offset count=$(($end_offset-$start_offset)) iflag=skip_bytes,count_bytes

Dejé el bssin especificar, pero se puede configurar en cualquier cosa. Un bs de 1MiB es una buena regla general.

Gracias.

Respuesta3

Cuando las herramientas existentes fallen, escriba las suyas propias:

#!/usr/bin/env python
start, end = 3020852, 13973824
with open("input.bin", "rb") as inf:
    with open("output.bin", "wb") as outf:
        inf.seek(start)
        data = inf.read(end-start)
        outf.write(data)
        # just in case
        assert(inf.tell() == end)

El tamaño total no es grande, por lo que simplemente lee todo el bloque en la RAM a la vez. Si quisieras copiar varios GB bloque a bloque, podrías hacerlo de esta manera:

#!/usr/bin/env python
start = 3020852
end = 13973824
size = end - start
bs = 32 << 20   # (32 MB)
with open("input.bin", "rb") as inf:
    with open("output.bin", "wb") as outf:
        inf.seek(start)
        while size > 0:
            data = inf.read(min(size, bs))
            outf.write(data)
            size -= len(data)
        assert(inf.tell() == end)

información relacionada