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)

相關內容