리눅스에서 주어진 크기로 파일을 만드는 방법?


답변:


187
dd if=/dev/zero of=upload_test bs=file_size count=1

어디를 file_size바이트 단위 테스트 파일의 크기


오, 그것은 한 블록에서 모두 수행하기 때문에 내 접근 방식보다 더 효율적일 수 있습니다. 좋은 생각.
Paul Tomblin

10
실제로 큰 블록 크기를 사용하면 쓰기 전에 해당 양을 메모리에 할당하고 읽을 수 있기 때문에 큰 블록 크기를 사용하면 성능이 크게 저하됩니다. 이것이 bs = 4GiB와 같은 것이라면 아마도 스와핑이 될 것입니다.
Brian

35
dd값이 2 ^ 32로 제한되어 있으므로 4GB보다 큰 파일을 만들려면 속임수가 dd if=/dev/zero of=test bs=1M count=<size in megabytes>있습니다.
Dmytro Sirenko

2
더 좋고 더 빠른 접근 방법에 대한 다음 답변을보십시오
우아한 주사위

2
@elegantdice 다음 중 어떤 대답이 다음인지 확실하지 않습니다. 위치를 변경할 수 있습니다.
vladkras

160

현대는 더 쉽고 빠릅니다. Linux에서 (하나 선택)

truncate -s 10G foo
fallocate -l 5G bar

그것은 필요가 있음을 언급 할 truncate파일 시스템에 지원 스파 스 파일 스파 스 파일을 만들 것입니다 fallocate하지 않습니다. 스파 스 파일은 파일을 구성하는 할당 단위가 실제로 사용될 때까지 할당 되지 않는 파일 입니다. 파일에 대한 메타 데이터는 것입니다 그러나 일부 상당한 공간이 있지만, 가능성이없는 경우 파일의 실제 크기 근처를 차지합니다. 이 유형의 파일에는 장단점이 있으므로 자세한 정보는 스파 스 파일에 대한 리소스를 참조하십시오. 스파 스가 아닌 파일에는 미리 할당 된 블록 (할당 단위)이 있으므로 파일 시스템이 보는 한 공간이 예약됩니다. 또한 fallocatetruncate지정된 값으로 파일의 내용을 설정하지 않습니다 같은 dd대신 파일의 내용을 할당 fallocate하거나 truncate생성하는 동안 상기 할당 유닛에 존재하고이 동작 또는 소망되지 않을 수있는 쓰레기 값일 수있다. 는 dd그것의 명령 행 옵션으로 지정된 실제로 전체 파일 스트림에 데이터의 값 또는 덩어리를 기록하기 때문에 가장 느린이다.

이 동작은 사용 된 파일 시스템 및 해당 파일 시스템이 표준 또는 사양에 맞는지에 따라 달라질 수 있습니다. 따라서 적절한 방법이 사용되도록 적절한 연구를 수행하는 것이 좋습니다.


나는 노력했다 truncate. 위의 구문을 사용하여 크기가 0 인 파일을 생성했습니다. 에 대한 'man page' fallocate는 그것이 생성하는 파일 space이 데이터가 아니라 비어 있다고 말합니다 . "1G 파일을 복사하는 데 시간이 얼마나 걸리는가"와 같은 일부 예상되는 경우에는 유용하지 않은 것으로 보입니다.
Mark Stosberg

6
fallocate가 나를 위해 잘 작동하는 것 같습니다. 적절한 크기의 파일을 만듭니다.
Aater Suleman

5
이것이이 질문에 대한 최선의 답변입니다. 잘림 / 내리기는 파일의 모든 블록을 쓰지 않기 때문에 오래 걸리지 않습니다. 그러나 결과 파일을 어딘가에 업로드하면 전체 내용에 대해 0을 읽습니다.
Mike Andrews

4
OSX에서이를 실행하려면 다음을 수행해야합니다 brew install coreutils.. 명령 앞에 g 가 추가 되므로 다음과 같이 실행해야합니다 gtruncate -s 10G foo. 도움이 되었기를 바랍니다!
DerekE

NTFS파티션에서 작동하지 않는 것 같습니다 .
eloyesp

40

Tom의 게시물 을 추적하기 위해 dd를 사용하여 스파 스 파일을 만들 수도 있습니다.

dd if=/dev/zero of=the_file bs=1 count=0 seek=12345

이렇게하면 대부분의 유닉스에서 "구멍"이있는 파일이 만들어집니다. 데이터는 실제로 디스크에 기록되지 않거나 0 이외의 것이 기록 될 때까지 공간을 차지하지 않습니다.


count = 0으로 설정하면 파일 크기에서 바이트를 빼지 않아도됩니다.
andrewdotn

3
with count=0, bs * seek파일 크기가 됨
Jayen

24

OSX (및 Solaris)에서이 mkfile명령도 사용할 수 있습니다.

mkfile 10g big_file

"big_file"이라는 10GB 파일이 만들어집니다. 이 방법을 여기 에서 찾았 습니다.


이는 truncatefallocate명령을 사용할 수없는 OS X와 ​​같은 상황에 유용 합니다. 메가 바이트가 아니라 dd위에서 설명한대로 작동합니다 . mM
user535673

잘못된 :이 10 생성 지브의 파일 (= ~ 10.7 GB)를.
디저트

20

이 명령을 사용하십시오 :

dd if = $ INPUT-FILE of = $ OUTPUT-FILE bs = $ BLOCK-SIZE count = $ NUM-BLOCKS

큰 (빈) 파일을 만들려면을 설정하십시오 $INPUT-FILE=/dev/zero.
파일의 전체 크기는입니다 $BLOCK-SIZE * $NUM-BLOCKS.
생성 된 새 파일은입니다 $OUTPUT-FILE.


왜 그 질문을 했습니까?
Henry B

9
답변을 구하기 위해 Google에 문의해야했기 때문에 여기에 올려 놓고 토론하고 최신 상태로 유지할 수있었습니다. 전체 사이트의 요점을 아시나요?
Grundlefleck

2
저는 사람들이 XP 창녀를 위해 @Grundlefleck을 투표하고 있다는 것을 알고 있습니다. 그러나 Jeff와 Joel이 구상 한이 사이트를 사용하는 방법 중 하나는 방금 발견 한 것에 대한 질문과 대답을하는 것입니다.
Paul Tomblin

3
고마워 폴 나는 그 요점에 대해 너무 귀찮게하지는 않지만, 내가 여기에서 묻지 않으면 결코 찾을 수없는 방식으로 결함이있을 수있는 Google에서 찾은 것들에 대해 귀찮게합니다. 사람들은, 그들은 내가 창녀라고 생각하면 내 Q / A 커뮤니티 소유하게 자유롭게해야 어깨를 으쓱를 .
Grundlefleck

2
faq의 인용에서 "자신의 프로그래밍 질문을하고 답하는 것도 완벽하지만, 당신이 Jeopardy에있는 척 : 질문의 형태로 표현하십시오."
Craig Angus

17

프로그래밍 방식으로 수행 할 수 있습니다.

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main() {
    int fd = creat("/tmp/foo.txt", 0644);
    ftruncate(fd, SIZE_IN_BYTES);
    close(fd);
    return 0;
}

이 방법은 파일을 메모리에 mmap 하는 데 특히 유용합니다 .

다음 명령을 사용하여 파일의 크기가 올바른지 확인하십시오.

# du -B1 --apparent-size /tmp/foo.txt

조심해:

# du /tmp/foo.txt

파일 시스템에서 지원하는 경우 Sparse 파일 로 할당되므로 0을 인쇄 합니다.

참조 : 남자 2 열림남자 2 자르기


10

당신은 할 수 있습니다 :

[dsm@localhost:~]$ perl -e 'print "\0" x 100' > filename.ext

100을 원하는 바이트 수로 바꿉니다.


그리고 실제 채우기 바이트도. "\ xff"가 필요하고 제대로 작동합니다. 감사! :)
Ray

10

이 답변 중 일부는 /dev/zero데이터 소스로 사용 하고 있습니다. 응용 프로그램은 압축, 제로의 찜질의 전체 파일하고있는 경우 테스트 네트워크 업로드 속도 있다면, 이것은 좋은 생각하지 않을 수 있습니다 정말 잘. 이 명령을 사용하여 파일 생성

 dd if=/dev/zero of=upload_test bs=10000 count=1

upload_test약 200 바이트로 압축 할 수 있습니다. 따라서 10KB 파일을 업로드한다고 생각하지만 실제로는 훨씬 적은 상황에 처할 수 있습니다.

내가 제안하는 것은 /dev/urandom대신 사용하는 것입니다 /dev/zero. 나는 출력을 전혀 압축하지 못했습니다 /dev/urandom.


내 임베디드 시스템에는이 없기 /dev/zero때문에 /dev/urandom좋습니다.
Fredrick Gauss

9
dd if=/dev/zero of=my_file.txt count=12345

4
dd의 기본 블록 크기는 512 바이트이므로이 명령은 파일 크기를 12345 * 512 바이트로 만듭니다.
아무도

4

많은 답변이 있지만, 다른 무엇을 할 수 있는지 잘 설명하지 못했습니다. dd대한 매뉴얼 페이지를 살펴보면 파일 크기를 더 잘 지정할 수 있습니다.

이것은 20 메가 바이트 크기의 0으로 채워진 /tmp/zero_big_data_file.bin을 만들 것입니다.

    dd if=/dev/zero of=/tmp/zero_big_data_file.bin  bs=1M count=20

이것은 1000 바이트의 크기로 0으로 채워진 /tmp/zero_1000bytes_data_file.bin을 만듭니다.

    dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1kB count=1

또는

    dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1000 count=1

  • 모든 예에서 bs는 블록 크기이고 count는 블록 수입니다.
  • BLOCKS 및 BYTES 뒤에는 다음 곱셈 접미사가 올 수 있습니다. c = 1, w = 2, b = 512, kB = 1000, K = 1024, MB = 1000 * 1000, M = 1024 * 1024, xM = M GB = 1000 T, P, E, Z, Y의 경우 * 1000 * 1000, G = 1024 * 1024 * 1024 등입니다.


3

현재 디렉토리에 임의의 문자가 포함 된 4MB 텍스트 파일과 이름 "4mb.txt"가 생성됩니다. 다른 크기와 이름을 생성하도록 매개 변수를 변경할 수 있습니다.

base64 /dev/urandom | head -c 4000000 > 4mb.txt

0

fallocate디스크를 기다리지 않으려면 사용하십시오 .

예:

fallocate -l 100G BigFile

용법:

Usage:
 fallocate [options] <filename>

Preallocate space to, or deallocate space from a file.

Options:
 -c, --collapse-range remove a range from the file
 -d, --dig-holes      detect zeroes and replace with holes
 -i, --insert-range   insert a hole at range, shifting existing data
 -l, --length <num>   length for range operations, in bytes
 -n, --keep-size      maintain the apparent size of the file
 -o, --offset <num>   offset for range operations, in bytes
 -p, --punch-hole     replace a range with a hole (implies -n)
 -z, --zero-range     zero and ensure allocation of a range
 -x, --posix          use posix_fallocate(3) instead of fallocate(2)
 -v, --verbose        verbose mode

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