
Eu tenho um arquivo que desejo onde o deslocamento do byte inicial é 3020852 e o deslocamento do byte final é 13973824.
Há alguma variação deste comando: dd ibs=X obs=Y skip=1 count=1
que ainda não comecei a trabalhar.
Responder1
Existem várias maneiras de fazer isso, como você pode ler emesta pergunta semelhante. Vou lhe dar a head | tail
abordagem (na minha opinião, a mais "idiomática") e a dd
abordagem.
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
Responder2
Com a ajuda de @agtoever e @tom-yan esta é a maneira mais rápida de conseguir isso:
dd if=somefile of=somefile2 skip=$start_offset count=$(($end_offset-$start_offset)) iflag=skip_bytes,count_bytes
Deixei o bs
não especificado, mas pode ser definido como qualquer coisa. Um 1MiB bs é uma boa regra prática.
Obrigado.
Responder3
Onde as ferramentas existentes falham, escreva a sua própria:
#!/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)
O tamanho total não é grande, portanto ele apenas lê o bloco inteiro na RAM de uma só vez. Se você quiser copiar vários GB bloco por bloco, poderá fazer desta forma:
#!/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)