dd - как извлечь подраздел файла с 2 смещениями?

dd - как извлечь подраздел файла с 2 смещениями?

У меня есть файл, в котором начальное смещение байтов составляет 3020852, а конечное смещение байтов — 13973824.

Есть некоторая вариация этой команды, dd ibs=X obs=Y skip=1 count=1которую я пока не запустил.

решение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

решение2

С помощью @agtoever и @tom-yan это самый быстрый способ добиться этого:

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

Я оставил bsнеуказанным, но его можно установить на что угодно. 1МиБ bs — это хорошее эмпирическое правило.

Спасибо.

решение3

Если существующие инструменты не справляются, напишите свой собственный:

#!/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)

Связанный контент