이것은 당신이 이것을 할 수있는 방법입니다 :
i=$(((t=19876543212)-(h=12345678901)))
{ dd count=0 skip=1 bs="$h"
dd count="$((i/(b=64*1024)-1))" bs="$b"
dd count=1 bs="$((i%b))"
} <infile >outfile
그게 정말 필요한 전부입니다-훨씬 더 필요하지 않습니다. 첫번째 장소에있는 dd count=0 skip=1 bs=$block_size1것 lseek()거의 순간적으로 일반 파일 입력을 이상. 데이터 가 누락 되거나 다른 사실이 알려지지 않은 경우 원하는 시작 위치로 직접 검색 할 수 있습니다. 파일 디스크립터는 쉘에 의해 소유되고의 파일 디스크립터는 dd이를 단순히 상속하기 때문에 커서 위치에 영향을 미치므로 단계적으로 수행 할 수 있습니다. 실제로는 매우 단순하며, 작업에 더 적합한 표준 도구는 없습니다 dd.
그것은 종종 이상적인 64k 블록 크기를 사용합니다. 대중적인 믿음과는 달리, 블록 크기가 클수록 dd작업 속도가 빨라 지지 않습니다 . 반면에 작은 버퍼도 좋지 않습니다. dd시스템 호출에서 시간을 동기화하여 데이터를 메모리에 복사하고 다시 기다릴 필요가 없으며 시스템 호출을 기다릴 필요가 없습니다. 따라서 다음 시간이 read()마지막에 기다릴 필요가 없지만 필요한 것보다 큰 크기로 버퍼링하는 데 시간이 오래 걸리기를 원합니다 .
따라서 첫 번째 dd는 시작 위치로 건너 뜁니다. 시간 이 걸리지 않습니다 . 그 시점에서 원하는 다른 프로그램을 호출하여 stdin을 읽으면 원하는 바이트 오프셋에서 직접 읽기 시작합니다. 다른 것을 호출 하여 stdout에 카운트 블록을 dd읽습니다 ((interval / blocksize) -1).
마지막으로 필요한 것은 이전 나누기 연산 의 계수 (있는 경우) 를 복사하는 것입니다 . 그게 다야.
그런데 사람들이 증거없이 자신의 얼굴에 사실을 진술 할 때 그것을 믿지 마십시오. 그렇습니다 dd. 짧은 읽기 가 가능합니다 (정상적인 블록 장치에서 읽을 때는 그러한 것이 불가능합니다) . 이러한 것들은 dd블록 디바이스 이외에서 읽은 스트림을 올바르게 버퍼링하지 않은 경우에만 가능합니다 . 예를 들면 다음과 같습니다.
cat data | dd bs="$num" ### incorrect
cat data | dd ibs="$PIPE_MAX" obs="$buf_size" ### correct
두 경우 모두 모든 데이터를 dd복사 합니다 . 첫 번째 경우는 가능하다 (으로 거의 발생하지 않지만 cat) , 출력 블록의 어떤 것이 dd오므 아웃 사본이 동일 "$ NUM을"비트 바이트 ddspec'd된다 만 전혀 아무것도로 버퍼 구체적으로는 - 명령을 요청할 때 선. bs=나타내는 최대 때문에 블록 크기를 목적 의이 dd실시간으로 I / O이다.
두 번째 예에서는 출력 블록 크기를 명시 적으로 지정하고 dd전체 쓰기가 완료 될 때까지 버퍼를 읽습니다. count=입력 블록을 기반으로하는 것은 영향 을 미치지 않지만 다른 블록이 필요합니다 dd. 그렇지 않으면 귀하에게 제공되는 모든 잘못된 정보는 무시해야합니다.
bs=1M iflag=skip_bytes,count_bytes