파일을 필요한 크기로 채우려면 어떻게 해야 합니까?

파일을 필요한 크기로 채우려면 어떻게 해야 합니까?

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

어떻게 패딩하나요?

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

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

답변1

seek물리적 패딩에 대한 답을 얻는 대신, 파일의 새 끝 부분에 단일 문자를 작성하여 파일의 패딩 공간 대부분을 비워("구멍") 둘 수 있습니다.

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

답변2

stdout을 제거 of=largerfile.txt하고 파일에 추가합니다.

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

답변3

@frostschutz가 제공한 간단한 답변이 답변으로 게시되었습니다.

truncate -s 16M thefile

답변4

꼭 사용해야 하나요 dd? 파일의 길이를 특정(논리적)으로 설정하려면 원하는 위치에 0을 쓰면 됩니다. 이전 끝과 쓰여진 바이트 사이의 바이트는 null 바이트를 갖는 것으로 나타납니다. 다음은 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이므로 다른 하나는 제거합니다.

관련 정보