dd if=somefile bs=1 skip=1337 count=31337000
1바이트 읽기 및 쓰기를 사용하지 않고 효율적으로 다음 과 같은 작업을 수행하는 방법은 무엇입니까 ?
해결책은 다음과 같습니다.
- 간단하게(간단하지 않은 경우 이 작업을 수행하는 Perl oneliner를 작성할 수 있음)
- 큰 오프셋과 길이를 지원하려면(따라서 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 #