У меня есть файл, который я хочу, где начальное смещение байта 3020852 и конечное смещение байта 13973824.
Есть несколько вариантов этой команды: dd ibs=X obs=Y skip=1 count=1
что я еще не получил работу.
Есть несколько способов сделать это, как вы можете прочитать в этом похожем вопросе. Я дам вам (на мой взгляд, самый "идиоматический") head | tail
Подход хвоста и подход dd
.
head --bytes=<end_offset> in_file.bin | tail --bytes=<end_offset - start_offset> > out_file.bin
В качестве альтернативы:
dd bs=1 skip=<start_offset> count=<end_offset - start_offset> < in_file > out_file.bin
Там, где существующие инструменты не работают, напишите свой собственный:
#!/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)
Общий размер не велик, поэтому он просто считывает весь блок в оперативную память одновременно. Если вы хотите скопировать несколько ГБ блок за блоком, вы можете сделать это следующим образом:
#!/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)
С помощью @agtoever и @ tom-yan это самый быстрый способ добиться этого:
dd if=somefile of=somefile2 skip=$start_offset count=$(($end_offset-$start_offset)) iflag=skip_bytes,count_bytes
Я оставил bs
неопределенным, но он может быть установлен на что угодно. 1MiB bs - хорошее эмпирическое правило.
Благодарю.