"dd bs=1 건너뛰기=N"이 아닌 지정된 오프셋에서 파일을 출력하는 방법은 무엇입니까?

"dd bs=1 건너뛰기=N"이 아닌 지정된 오프셋에서 파일을 출력하는 방법은 무엇입니까?

dd if=somefile bs=1 skip=1337 count=313370001바이트 읽기 및 쓰기를 사용하지 않고 효율적으로 다음 과 같은 작업을 수행하는 방법은 무엇입니까 ?

해결책은 다음과 같습니다.

  1. 간단하게(간단하지 않은 경우 이 작업을 수행하는 Perl oneliner를 작성할 수 있음)
  2. 큰 오프셋과 길이를 지원하려면(따라서 dd의 블록 크기를 해킹하는 것은 도움이 되지 않습니다)

부분적인 해결책(충분히 간단하지 않습니다. 길이를 동일하게 시도하면 훨씬 더 복잡해집니다):

dd if=somefile bs=1000 skip=1 count=31337 | { dd bs=337 count=1 of=/dev/null; rest_of_pipeline; }
# 1337 div 1000 and 1337 mod 1000

답변1

이렇게 해야 합니다(gnu dd에서).

dd if=somefile bs=4096 skip=1337 count=31337000 iflag=skip_bytes,count_bytes

seek=함께 사용하고 있는 경우에는 oflag=seek_bytes.

에서 info dd:

`count_bytes'
      Interpret the `count=' operand as a byte count, rather than a
      block count, which allows specifying a length that is not a
      multiple of the I/O block size.  This flag can be used only
      with `iflag'.

`skip_bytes'
      Interpret the `skip=' operand as a byte count, rather than a
      block count, which allows specifying an offset that is not a
      multiple of the I/O block size.  This flag can be used only
      with `iflag'.

`seek_bytes'
      Interpret the `seek=' operand as a byte count, rather than a
      block count, which allows specifying an offset that is not a
      multiple of the I/O block size.  This flag can be used only
      with `oflag'.

Ps: 이 질문은 오래되었고 이 플래그는 질문이 처음 제기된 후에 구현된 것 같습니다. 하지만 제가 수행한 관련 dd 검색에 대한 첫 번째 Google 결과 중 하나이기 때문에 새로운 것으로 업데이트하는 것이 좋을 것 같습니다. 특징.


참고: 이 답변은 다음에만 적용됩니다.GNU dd, 대부분의 Linux 배포판에서 사용되며 다음의 일부입니다.GNU coreutils 패키지, 이 기능은 coreutils 릴리스 8.16(2012-03-26, 원래 질문에 답변한 지 몇 달 후)에 도입되었습니다.

참고 사항Mac 사용자: MacOS는 Unix 유틸리티의 bsd 기반 변형을 사용하지만(주로 라이센스상의 이유로) Unix 유틸리티의 GNU 버전은 일반적으로 훨씬 더 활발하게 개발되고 있으며 일반적으로 훨씬 더 많은 기능을 가지고 있습니다. 다음을 사용하여 Mac에 GNU coreutils를 설치할 수 있습니다.홈브류: brew install coreutils.

답변2

하나의 프로세스를 사용하여 모든 초기 바이트를 버리고 두 번째 프로세스를 사용하여 실제 바이트를 읽습니다. 예:

echo Hello, World\! | ( dd of=/dev/null bs=7 count=1 ; dd bs=5 count=1 )

두 번째는 dd효율적이라고 생각되는 블록 크기로 입력을 읽을 수 있습니다. 이를 위해서는 추가 프로세스가 필요합니다. OS에 따라 비용이 발생하지만 파일을 1바이트씩 읽는 것보다 작을 수 있습니다(아주 작은 파일이 있는 경우에는 문제가 없습니다).

답변3

bs=1그 이상을 사용하는 대신 bs=4096.

답변4

hexdump 명령을 사용해 볼 수 있습니다.

hexdump  -v <File Path> -c -n <No of bytes to read> -s <Start Offset>

단순히 내용을 보고 싶다면:

#/usr/bin/hexdump -v -C mycorefile -n 100 -s 100
00000064 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00000074 00 00 00 00 01 00 00 00 05 00 00 00 00 10 03 00 |................| 
00000084 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 |......@.........| 
00000094 00 00 00 00 00 00 00 00 00 00 00 00 00 a0 03 00 |................| 
000000a4 00 00 00 00 00 10 00 00 00 00 00 00 01 00 00 00 |................| 
000000b4 06 00 00 00 00 10 03 00 00 00 00 00 00 90 63 00 |..............c.| 
000000c4 00 00 00 00 |....| 
000000c8 #

관련 정보