일반 작은 파일에 dd를 사용할 수 있나요?

일반 작은 파일에 dd를 사용할 수 있나요?

남성 dd:

dd - 파일 변환 및 복사

을 사용하려고 합니다 dd. 이상하게도 1바이트 텍스트 파일을 복사하면 훨씬 작아집니다.

$ block_size=1; device_to_edit=/media/ramdrive/a; device_from=/media/ramdrive/b; echo "aaaaaaaaaa">$device_to_edit; echo "bbbbbbbbbb">$device_from; cat $device_to_edit; cat $device_from; dd if=$device_from of=$device_to_edit count=1 seek=2 skip=2 bs=$block_size; cat $device_to_edit
aaaaaaaaaa
bbbbbbbbbb
1+0 records in
1+0 records out
1 byte copied, 0,000156688 s, 6,4 kB/s
aab

1 byte copied왜 파일 끝이 사라졌 습니까 ?

추가됨:

의견에서 제안한 대로 conv=notrunc수정합니다. 하지만 다음에서 man:

conv=CONVS 쉼표로 구분된 기호 목록에 따라 파일을 변환합니다.

파일을 변환하고 싶지 않았습니다. 블록 장치 복사에 대해 읽을 때 이 피연산자를 본 적이 없습니다. 모든 파일(예: /dev/sdb: USB 디스크의 512바이트 블록 하나)이 변경되지 않은 경우에도 항상 필요합니까?

답변1

당신이 하고 있는 일은 다음과 같습니다:

block_size=1; 
dd ... count=1 seek=2 skip=2 bs=$block_size; 

dd1바이트만 복사하려고 합니다 . 그러나 기본적으로 출력 파일을 잘라내어 파일 끝이 dd완료된 위치가 됩니다.

$ echo abcdefgh > test1
$ echo 12345678 > test2
$ dd count=1 bs=1 skip=2 seek=2 if=test1 of=test2
1+0 records in
1+0 records out
1 byte copied, 0.000179375 s, 5.6 kB/s
$ cat test2; echo
12c

제가 갖고 있는 GNU 맨페이지에는 명시적으로 그런 내용이 나와 있지 않은 것 같습니다.POSIX 설명은:

of=file
출력 경로 이름을 지정하십시오. [...] seek=expr지정되었지만 conv=notrunc지정되지 않은 경우 복사 효과는 dd가 검색하는 출력 파일의 블록을 보존하지만 출력 파일의 다른 부분은 보존되지 않습니다. (검색 크기에 입력 파일 크기를 더한 값이 이전 출력 파일 크기보다 작으면 출력 파일은 복사본만큼 짧아집니다.[...])

이를 방지하려면 다음 conv=notrunc옵션을 추가하세요.

notrunc
출력 파일을 자르지 마십시오

$ echo 12345678 > test2
$ dd conv=notrunc count=1 bs=1 skip=2 seek=2 if=test1 of=test2
1+0 records in
1+0 records out
1 byte copied, 0.00019385 s, 5.2 kB/s
$ cat test2
12c45678

notrunc실제로 복사된 데이터를 수정하지 않으므로 에 대한 플래그로 사용되더라도 그런 의미에서는 "변환"이 아닙니다 conv.

count=주어지면 dd정확히 그만큼의 read()호출을 수행합니다. 즉, 짧은 읽기를 제공할 수 있는 장치에서 읽는 경우 실제로 읽은 데이터의 양은 count시간이 아닙니다 bs.

답변2

전체 문서를 살펴봤어야 했습니다 man dd.

Full documentation at: <https://www.gnu.org/software/coreutils/dd>
       or available locally via: info '(coreutils) dd invocation'

'of=FILE' 표준 출력 대신 FILE에 씁니다. 'conv=notrunc'가 지정되지 않으면 'dd'는 FILE을 0바이트(또는 'seek='로 지정된 크기)로 자릅니다.

관련 정보