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


15

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

패드는 어떻게합니까?

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

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

2
@ 테라 바이트; 실제 패딩 또는 논리 패딩을 원하십니까? 다시 말해; 파일 크기가 16777216 (구멍을 포함 할 수 있음) 만 표시해야하거나 디스크의 해당 스토리지 양을 차지해야합니까? -BTW, bs=1in을 선택하는 dd것은 경험상 런타임이 매우 비쌉니다.
Janis

5
truncate -s 16M thefile
frostschutz

4
좋은 답변이 될 @frostschutz를 답변으로 게시했습니다.
derobert

@derobert, StackExchange 사이트 사용자가 합법적이고 간단한 답변을 의견으로 게시하는 것은 무엇입니까?
user1717828

@ user1717828 확실하지 않습니다. 메타에 대한 좋은 질문 일 것입니다.
derobert

답변:


10

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

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

1
seek여기에 올바른 옵션입니다.
0andriy

15

실제 패딩을 얻는 대답 외에도 파일 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

3
옳은. 이 경우 truncate -s +262144 largerfile.txt에도 빠릅니다.
don_crissti

4

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

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

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

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

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


당신은 오해 : count=0지정되지 않았지만 일반적으로 count매개 변수가 지정 되지 않은 경우와 동일 합니다. 더 많은 문제 : dd파일을 16777216 바이트로 자르지 만, 결국 구멍이 생길 수 있기를 원한다면 구멍 후에 데이터를 먼저 쓰고 나중에 데이터가없는 크기로 잘라야하기 때문에 잘못되었습니다 .
schily

count = 0은 count 매개 변수를 지정하지 않는 것과 다릅니다. 당신은 그것 dd if=/dev/zero of=somefile과 같다고 말하는가 dd if=/dev/zero of=somefile count=0? 시도 해봐.
PeteC

물론이야! count=0 is 당신이 전혀 카운트 매개 변수를 지정하지 않은 경우와 동일합니다. 이것은 적어도 원본 소스에서 파생 된 모든 구현에 해당됩니다. 시도해보십시오 dd. 원래 명령으로 작업하지 않은 것 같습니다 .
schily

count'이 매개 변수 무시' 를 의미 하는 고유 값으로 0을 지정하는 문서를 찾을 수 없습니다 . 찾을 수 있습니까? 이러한 문서가 없으면 count=0'제로 블록 작성'을 의미하며 이로부터의 편차는 버그입니다 (원본 소스 또는 아니오).
PeteC

1
이것은 불특정 한 텍스트가 수정 된 2015 년 5 월 이전의 POSIX 문서입니다.
schily

1

사용해야 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으로 색인되어 있기 때문에 다른 쪽을 벗어납니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.