Làm cách nào để tạo một tệp có kích thước nhất định trong Linux?


Câu trả lời:


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

Trong trường hợp file_sizelà kích thước của tập tin thử nghiệm của bạn trong byte


Ồ, điều đó có thể hiệu quả hơn cách tiếp cận của tôi bởi vì nó thực hiện tất cả trong một khối. Ý tưởng tốt.
Paul Tomblin

10
Trên thực tế, việc sử dụng một khối kích thước khổng lồ sẽ hoạt động tồi tệ hơn nhiều khi nó trở nên rất lớn, vì nó sẽ phân bổ và đọc số tiền đó vào bộ nhớ trước khi viết. Nếu điều này đôi khi giống như bs = 4GiB, có lẽ bạn sẽ kết thúc việc hoán đổi.
Brian

34
ddcó giới hạn 2 ^ 32 cho các giá trị của nó, vì vậy để tạo tệp lớn hơn 4 GB, có một mẹo : dd if=/dev/zero of=test bs=1M count=<size in megabytes>.
Dmytro Sirenko

2
Xem câu trả lời tiếp theo để có cách tiếp cận tốt hơn, nhanh hơn
súc sắc tao nhã

2
@elegantdice Không rõ câu trả lời nào tiếp theo, họ có thể thay đổi vị trí của mình
vladkras

160

Xin vui lòng, hiện đại là dễ dàng hơn, và nhanh hơn. Trên Linux, (chọn một)

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

cần phải được tuyên bố rằng truncatetrên một hệ thống tập tin hỗ trợ file thưa thớt sẽ tạo ra một tập tin thưa thớt và fallocatesẽ không. Một tệp thưa là một trong đó các đơn vị phân bổ tạo nên tệp không thực sự được phân bổ cho đến khi sử dụng. Tuy nhiên, siêu dữ liệu cho tệp sẽ chiếm một khoảng không gian đáng kể nhưng có thể không ở gần kích thước thực của tệp. Bạn nên tham khảo tài nguyên về các tệp thưa để biết thêm thông tin vì có những ưu điểm và nhược điểm đối với loại tệp này. Một tệp không thưa thớt có các khối (đơn vị phân bổ) được phân bổ trước thời hạn, có nghĩa là không gian được dành riêng cho đến khi hệ thống tệp nhìn thấy nó. Ngoài ra fallocatecũng truncatesẽ không đặt nội dung của tệp thành một giá trị được chỉ định như dd, thay vào đó, nội dung của tệp được phân bổ có fallocatehoặc truncatecó thể là bất kỳ giá trị rác nào tồn tại trong các đơn vị được phân bổ trong quá trình tạo và hành vi này có thể hoặc không được mong muốn. Tốc ddđộ chậm nhất vì nó thực sự ghi giá trị hoặc khối dữ liệu vào toàn bộ luồng tệp như được chỉ định với các tùy chọn dòng lệnh của nó.

Hành vi này có thể có khả năng khác nhau - tùy thuộc vào hệ thống tệp được sử dụng và sự phù hợp của hệ thống tệp đó với bất kỳ tiêu chuẩn hoặc thông số kỹ thuật nào. Do đó, nên thực hiện nghiên cứu thích hợp để đảm bảo sử dụng phương pháp thích hợp.


Tôi đã thử truncate. Nó tạo ra một tệp có kích thước bằng không bằng cú pháp ở trên. 'Trang man' cho fallocatebiết rằng các tệp mà nó tạo ra đầy trống spacethay vì dữ liệu. Có vẻ như nó sẽ không hữu ích cho một số trường hợp dự kiến ​​như "mất bao lâu để sao chép tệp 1G".
Mark Stosberg

6
ngụy biện dường như làm việc tốt cho tôi. Nó tạo ra một tập tin đúng kích cỡ.
Aater Suleman

5
Đây là câu trả lời tốt nhất cho câu hỏi này. Việc cắt bớt / ngụy biện không mất nhiều thời gian, vì nó không ghi tất cả các khối của tệp. Nhưng, nếu sau đó bạn tải lên tệp kết quả ở đâu đó, nó sẽ đọc số không cho toàn bộ.
Mike Andrew

4
Nếu bạn muốn chạy cái này trong OSX, thì bạn sẽ cần phải làm điều này : brew install coreutils. Điều này sẽ thêm một g ở phía trước lệnh, vì vậy bạn phải chạy nó như thế này : gtruncate -s 10G foo. Hi vọng điêu nay co ich!
DerekE

Có vẻ như nó không hoạt động trên một NTFSphân vùng.
eloyesp

40

Chỉ cần theo dõi bài đăng của Tom , bạn cũng có thể sử dụng dd để tạo các tệp thưa thớt:

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

Điều này sẽ tạo ra một tệp có "lỗ hổng" trong hầu hết các bản không trộn - dữ liệu sẽ không thực sự được ghi vào đĩa hoặc chiếm bất kỳ khoảng trống nào cho đến khi một cái gì đó khác 0 được ghi vào đó.


Đặt đếm = 0 tránh phải trừ một byte khỏi kích thước tệp.
andrewdotn

3
với count=0, bs * seektrở thành kích thước tệp
Jayen

24

Trên OSX (và Solaris, rõ ràng), mkfilelệnh cũng có sẵn:

mkfile 10g big_file

Điều này tạo ra một tệp 10 GB có tên "big_file". Tìm thấy phương pháp này ở đây.


Điều này hữu ích cho các tình huống như OS X nơi các lệnh truncatefallocatelệnh không khả dụng. ddcũng hoạt động như mô tả ở trên mặc dù nó mcho megabyte, không phải M.
dùng535673

Sai: Điều này tạo ra tệp 10 GiB (= ~ 10,7 GB).
tráng miệng

20

Sử dụng lệnh này:

dd if = $ INPUT-FILE of = $ OUTPUT-FILE bs = $ BLOCK-SIZE đếm = $ NUM-BLOCKS

Để tạo một tệp lớn (trống), đặt $INPUT-FILE=/dev/zero.
Tổng kích thước của tập tin sẽ được $BLOCK-SIZE * $NUM-BLOCKS.
Tập tin mới được tạo sẽ được $OUTPUT-FILE.


Tại sao bạn lại đặt câu hỏi?
Henry B

9
Tôi đã phải Google cho câu trả lời, vì vậy tôi đã đặt nó ở đây, để nó có thể được thảo luận và cập nhật ... bạn có biết, quan điểm của toàn bộ trang web không?
Grundlefleck

2
Tôi biết mọi người đang bỏ phiếu @Grundlefleck cho XP whore, nhưng anh ta có một điểm - một trong những cách để sử dụng trang web này như Jeff và Joel đã hình dung là đặt câu hỏi và trả lời cho điều gì đó bạn vừa khám phá.
Paul Tomblin

3
Cảm ơn Paul. Mặc dù tôi không quá bận tâm về các điểm, tôi cảm thấy phiền về những điều tôi tìm thấy trên Google có thể bị thiếu sót theo một cách nào đó mà tôi không bao giờ tìm hiểu về trừ khi tôi hỏi ở đây. Mọi người nên thoải mái biến cộng đồng Q / A của tôi thành sở hữu nếu họ nghĩ rằng tôi đang làm phiền, nhún vai .
Grundlefleck

2
Để trích dẫn từ faq "Việc hỏi và trả lời câu hỏi lập trình của riêng bạn là hoàn toàn tốt, nhưng giả vờ bạn đang ở trên Jeopardy: diễn đạt nó dưới dạng câu hỏi."
Craig Angus

17

Bạn có thể làm điều đó theo chương trình:

#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;
}

Cách tiếp cận này đặc biệt hữu ích để sau đó mmap tệp vào bộ nhớ.

sử dụng lệnh sau để kiểm tra xem tệp có đúng kích cỡ không:

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

Hãy cẩn thận:

# du /tmp/foo.txt

có thể sẽ in 0 vì nó được phân bổ dưới dạng tệp thưa nếu được hệ thống tệp của bạn hỗ trợ.

xem thêm: người đàn ông 2 mởngười đàn ông 2 cắt ngắn


10

bạn có thể làm:

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

Nơi bạn thay thế 100 bằng số byte bạn muốn viết.


Và byte điền thực tế là tốt. Tôi cần "\ xff" và hoạt động tốt. Cảm ơn! :)
Ray

10

Một số câu trả lời có bạn sử dụng /dev/zerocho nguồn dữ liệu của bạn. Nếu tốc độ tải lên mạng thử nghiệm của bạn, đây có thể không phải là ý tưởng tốt nhất nếu ứng dụng của bạn thực hiện bất kỳ thao tác nén nào, một tệp chứa đầy các số không nén thực sự tốt. Sử dụng lệnh này để tạo tập tin

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

Tôi có thể nén upload_testxuống khoảng 200 byte. Vì vậy, bạn có thể đặt mình vào tình huống mà bạn nghĩ rằng việc tải lên tệp 10KB nhưng thực tế nó sẽ ít hơn nhiều.

Những gì tôi đề nghị là sử dụng /dev/urandomthay vì /dev/zero. Tôi không thể nén đầu ra của /dev/urandomrất nhiều.


Hệ thống nhúng của tôi không có /dev/zero, vậy /dev/urandomlà tốt.
Fredrick Gauss

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

4
Hãy nhớ rằng kích thước khối mặc định của dd là 512 byte, vì vậy lệnh này sẽ tạo một tệp có kích thước 12345 * 512 byte.
không ai

4

Có rất nhiều câu trả lời, nhưng không có câu trả lời độc đáo nào khác có thể được thực hiện. Nhìn vào trang man cho dd , có thể xác định rõ hơn kích thước của tệp.

Điều này sẽ tạo /tmp/zero_big_data_file.bin chứa đầy số không, có kích thước 20 megabyte:

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

Điều này sẽ tạo /tmp/zero_1000bytes_data_file.bin chứa đầy số không, có kích thước 1000 byte:

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

hoặc là

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

  • Trong tất cả các ví dụ, bs là kích thước khối và số lượng là số khối
  • BLOCKS và BYTES có thể được theo sau bởi các hậu tố nhân sau: c = 1, w = 2, b = 512, kB = 1000, K = 1024, MB = 1000 * 1000, M = 1024 * 1024, xM = M GB = 1000 * 1000 * 1000, G = 1024 * 1024 * 1024, v.v. đối với T, P, E, Z, Y.


3

Điều này sẽ tạo tệp văn bản 4 MB với các ký tự ngẫu nhiên trong thư mục hiện tại và tên của nó "4mb.txt" Bạn có thể thay đổi các tham số để tạo các kích cỡ và tên khác nhau.

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

0

Sử dụng fallocatenếu bạn không muốn đợi đĩa.

Thí dụ:

fallocate -l 100G BigFile

Sử dụng:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.