obs 및 eek가 있는 dd로 인해 파일 크기가 예상치 않게 됩니다.

obs 및 eek가 있는 dd로 인해 파일 크기가 예상치 않게 됩니다.

dd나는 그 주장에 대해 실험적으로 작업함으로써 그것을 사용하는 방법을 배우고 있습니다. 10바이트 파일을 만들고 싶습니다. 나는 다음이 효과가 있다고 생각합니다.

dd if=/dev/zero of=./foo count=1 bs=1 obs=9 seek=1

...맨 페이지에 다음과 같은 설명이 있기 때문입니다.

   obs=BYTES
          write BYTES bytes at a time (default: 512)
   seek=N skip N obs-sized blocks at start of output

...하지만 그렇지는 않습니다. 2바이트 파일을 생성합니다.

>ls -l foo
-rw-rw-r-- 1 user user 2 Mar 28 16:05 foo

내 솔루션은 다음과 같습니다

dd if=/dev/zero of=./foo count=1 bs=1 obs=1 seek=9

하지만 내 연구에서는 첫 번째 버전이 작동하지 않는 이유를 이해하고 싶습니다. 감사해요.

답변1

과 간의 상호 작용이 잘 정의되지 않았기 dd if=/dev/zero of=./foo count=1 bs=1 obs=9 seek=1때문에 명령은 10바이트 파일 대신 2바이트 파일을 생성 합니다 . (원하는 경우 이를 프로그램 오류라고 부를 수 있지만 문서 오류로 정의하는 것이 더 좋습니다.)bsobs누구나 bs 또는 ibs그리고 obs.

경험상 bs덮어쓰면 obs보시 dd if=/dev/zero of=./foo count=1 bs=1 seek=1다시피 2바이트 파일이 생성되는 것 같습니다.

이를 사용하면 dd if=/dev/zero of=./foo count=1 ibs=1 obs=9 seek=1예상되는 10바이트 파일을 얻게 됩니다.

대안으로, 디스크의 데이터 공간을 전혀 차지하지 않는 빈 파일을 생성하려면 직관적이지 않은 명명 truncate명령을 사용할 수 있습니다.

truncate --size=10 foo

답변2

이것POSIX 맨페이지상태:

ibs=표현식

expr을 통해 입력 블록 크기를 바이트 단위로 지정합니다(기본값 512).

obs=표현

expr을 통해 출력 블록 크기를 바이트 단위로 지정합니다(기본값 512).

bs=표현식

둘 다 설정입력과 출력블록 크기를 expr 바이트로,ibs= 및 obs=를 대체합니다.. sync, noerror 및 notrunc 이외의 변환이 지정되지 않은 경우 각 입력 블록은 짧은 블록을 집계하지 않고 단일 블록으로 출력에 복사되어야 합니다.

리눅스도 dd같은 방식으로 작동합니다. 대신 다음을 ibs사용하십시오.

dd if=/dev/zero of=./foo count=1 ibs=1 obs=9 seek=1

관련 정보