이것은 당신이 이것을 할 수있는 방법입니다 :
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을"비트 바이트 dd
spec'd된다 만 전혀 아무것도로 버퍼 구체적으로는 - 명령을 요청할 때 선. bs=
나타내는 최대 때문에 블록 크기를 목적 의이 dd
실시간으로 I / O이다.
두 번째 예에서는 출력 블록 크기를 명시 적으로 지정하고 dd
전체 쓰기가 완료 될 때까지 버퍼를 읽습니다. count=
입력 블록을 기반으로하는 것은 영향 을 미치지 않지만 다른 블록이 필요합니다 dd
. 그렇지 않으면 귀하에게 제공되는 모든 잘못된 정보는 무시해야합니다.
bs=1M iflag=skip_bytes,count_bytes