남성 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;
dd
1바이트만 복사하도록 요청하고 있습니다 . 그러나 기본적으로 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에 씁니다. 'dd'는 'conv=notrunc'가 지정되지 않는 한 FILE을 0바이트(또는 'seek='로 지정된 크기)로 자릅니다.