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)

관련 정보