
시작 바이트 오프셋이 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)