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が、任意の値に設定できます。1MiB 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)

合計サイズは大きくないので、ブロック全体を一度に RAM に読み込みます。数 GB をブロックごとにコピーしたい場合は、次のようにします。

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

関連情報