[unix] 파일을 원하는 크기로 채우는 방법?

16MiB (16777216 바이트)에 도달 할 때까지 채울 파일이 있습니다. 현재는 16515072 바이트입니다. 차이점은 262144 바이트입니다.

패드는 어떻게합니까?

이것은 작동하지 않는 것 같습니다.

cp smallfile.img largerfile.img
dd if=/dev/zero of=largerfile.img bs=1 count=262144



답변

of=largerfile.txt파일을 삭제하고 stdout을 파일에 추가하십시오.

dd if=/dev/zero bs=1 count=262144 >> largerfile.txt


답변

실제 패딩을 얻는 대답 외에도 파일 seek의 새로운 끝 위치 에 ing하고 단일 문자를 작성하여 파일 의 패딩 공간을 대부분 비워 둘 수 있습니다 ( “구멍”) .

dd if=/dev/zero of=largerfile.txt bs=1 count=1 seek=16777215

(이 기능은 특히 성능 bs=1이 뛰어나고 많은 양의 추가 디스크 공간을 차지하지 않는 이점이 있습니다 ).

이 방법은 문자를 추가하지 않고 if=/dev/null원하는 최종 파일 크기를 사용하여 작동하는 것처럼 보입니다 .

dd if=/dev/null of=largerfile.txt bs=1 count=1 seek=16777216

더 큰 블록 크기를 사용하는 물리적 패딩 솔루션의 성능 변형은 다음과 같습니다.

padding=262144 bs=32768 nblocks=$((padding/bs)) rest=$((padding%bs))
{
  dd if=/dev/zero bs=$bs count=$nblocks
  dd if=/dev/zero bs=$rest count=1
} 2>/dev/null >>largerfile.txt


답변

여기에서 가장 좋은 답변은 Janis ‘s (위)입니다. 현재 파일 크기를 잊고 계산하지 않고 원하는 크기로 직접 채울 수 있기 때문입니다.

또한 / dev / zero를 추가하지 않는 스파 스 파일을 활용합니다.

‘count’는 0으로 허용되고 여전히 패딩을 얻으므로 대답은 더 깔끔 할 수 있습니다.

dd if=/dev/null of=largerfile.txt bs=1 count=0 seek=16777216

(편집 : 이것은 GNU dd에는 맞지만 동작 count=0은 플랫폼에 따라 다릅니다. 주석 참조)


답변

사용해야 dd합니까? 파일의 특정 (논리적) 길이를 원하면 원하는 위치에 0을 쓰십시오. 이전 끝과 기록 된 바이트 사이의 바이트는 널 바이트를 갖는 것으로 표시됩니다. 다음은 perl을 사용한 예입니다.

$ echo Hello > file
$ ls -l file
-rw-r--r-- 1 user group 6 Apr 16 22:59 file
$ perl -le 'open(my $f,"+<","file"); seek($f, 16777216 - 2, 0); print $f "\0"'
$ ls -ln file
-rw-r--r-- 1 user group 16777216 Apr 16 22:59 file

왜 “-2″가 줄에 있습니까? 스크립트는 바이트를 작성하므로 1을 빼서 해당 바이트 앞의 위치를 ​​찾습니다. 탐색 위치가 0으로 색인되어 있기 때문에 다른 쪽을 벗어납니다.


답변