합리적인 속도로 바이너리 파일의 임의 부분을 어떻게 복사할 수 있나요?

합리적인 속도로 바이너리 파일의 임의 부분을 어떻게 복사할 수 있나요?

합리적인 속도로 바이너리 파일의 임의 부분을 어떻게 복사할 수 있나요?

분명히 ddwith는 bs=1매우 느리고 bs다른 값으로 설정하면 임의의 부분을 복사하는 것이 불가능합니다.

이게 잘못된 건가요? 그것은 사용될 수 있습니까 dd? 그렇지 않다면 도구는 무엇입니까?

예를 들어, 이 명령은

dd if="$img" of=tail.bin bs=2147483648 skip=1 status=progress

잘못된 꼬리를 복사하세요.

이 명령

dd if="$img" of=tail.bin bs=1 skip=2147483648 status=progress

아주 느린.

답변1

GNU dd는 count_bytes, seek_bytes, skip_bytes플래그를 지원합니다. 이를 통해 임의의 오프셋 및 크기와 함께 고성능 블록 크기 선택을 사용할 수 있습니다.

바이트 단위를 지정하면 GNU dd는 버전 9.1부터 기본적으로 이를 수행합니다.

에서 인용코어유틸/뉴스:

블록 수가 "B"로 끝나는 경우 dd는 이제 블록 대신 바이트를 계산합니다. 예를 들어 "dd count=100KiB"는 이제 102,400개 블록 대신 100KiB의 데이터를 복사합니다. 따라서 count_bytes, Skip_bytes 및 eek_bytes 플래그는 아직 유효하지만 더 이상 사용되지 않으며 더 이상 문서화되지 않습니다.

또 다른 옵션은 원하는 오프셋과 크기 제약을 사용하여 루프 장치를 만드는 것입니다. 이는 기본적으로 임의의 오프셋을 지원하지 않는 dd(또는 다른 프로그램)에 적용됩니다.

또는 bs=1인 첫 번째/마지막 청크의 일부만 복사하고 원하는 청크 크기가 더 큰 중간 세그먼트를 복사하는 것도 고려할 수 있습니다.

답변2

이 시도:

tail -c +$FROM file.dat | head -c $LENGTH > file1.dat

필요에 따라 FROM 및 LENGTH를 할당하면 됩니다. 번호 지정 tail은 1을 기준으로 합니다. 예를 들어 tail -c +4네 번째 바이트부터 시작한다는 의미입니다. 즉 처음 3바이트를 건너뜁니다.

예를 들어:

$ printf 'abcdefghijklmnopqrstuvwxyz\n' > test.txt
$ tail -c +4 test.txt | head -c 6; echo
defghi

답변3

파일의 전체 끝 부분이 특정 위치에서 시작되도록 하려면 한 가지 접근 방식은 파일 설명자를 올바른 위치로 찾은 다음 catPerl과 셸을 사용하여 리디렉션하는 것이 비교적 간단합니다.

$ printf 'abcdefghijklmnopqrstuvwxyz\n' > test.txt
$ { perl -e 'sysseek STDIN, 23, 0'; cat; } < test.txt
xyz

또는 환경을 통해 전달된 개수를 사용하여 코드와 혼동하지 않도록 하세요.

$ { N=23 perl -e 'sysseek STDIN, $ENV{N}, 0'; cat; } < test.txt
xyz

서브쉘 (perl; cat)도 작동합니다. 이는아니요동일한 열린 파일 설명을 perl사용하는 파이프입니다 . cat위에서는 오류 검사가 부족하다는 점에 유의하세요. 하지만 조회가 실패하면 조회가 발생하지 않습니다.

설정된 바이트 수만 복사하려면 head -c대신 에 파이프를 사용하십시오 cat.

$ start=3 count=6
$ { N=$start perl -e 'sysseek STDIN, $ENV{N}, 0'; head -c $count; } < test.txt; echo
defghi

관련 정보