我有一个想要的文件,其中起始字节偏移量是 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)