
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=1
que aún no tengo funcionando.
Respuesta1
Hay varias maneras de hacer esto, como puedes leer enesta pregunta similar. Te daré el head | tail
enfoque (en mi opinión, el más "idiomático") y el dd
enfoque.
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 bs
sin 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)