190

出于测试目的,我必须生成一个特定大小的文件(以测试上传限制)。

在 Linux 上创建一定大小的文件的命令是什么?

4

13 回答 13

217

对于小文件:

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

file_size测试文件的大小(以字节为单位)在哪里。

对于大文件:

dd if=/dev/zero of=upload_test bs=1M count=size_in_megabytes
于 2008-09-26T12:53:11.010 回答
196

拜托,现代更容易,更快。在 Linux 上,(选择一个)

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

需要说明的是,在支持稀疏文件的文件系统上,truncate会创建稀疏文件而fallocate不会。稀疏文件是组成文件的分配单元在使用之前没有实际分配的文件。然而,文件的元数据占用一些相当大的空间,但可能不会接近文件的实际大小。您应该查阅有关稀疏文件的资源以获取更多信息,因为这种类型的文件有利有弊。非稀疏文件的块(分配单元)是提前分配的,这意味着只要文件系统看到它,就会保留空间。也不会将文件的内容设置为指定的值fallocate例如truncate ddfallocate,而不是分配有或可能是在创建期间分配单元中存在的任何垃圾值的文件的内容,truncate并且可能需要也可能不需要这种行为。是最慢的dd,因为它实际上将值或数据块写入整个文件流,如其命令行选项所指定。

这种行为可能会有所不同——取决于使用的文件系统以及该文件系统是否符合任何标准或规范。因此,建议进行适当的研究以确保使用适当的方法。

于 2012-01-03T00:25:59.383 回答
41

只是为了跟进Tom 的帖子,您也可以使用 dd 创建稀疏文件:

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

这将在大多数 unix 上创建一个带有“洞”的文件 - 数据实际上不会被写入磁盘,或占用任何空间,直到写入非零的内容。

于 2008-09-26T13:11:29.577 回答
28

使用这个命令:

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

要创建一个大(空)文件,请设置$INPUT-FILE=/dev/zero.
文件的总大小将是$BLOCK-SIZE * $NUM-BLOCKS.
创建的新文件将是$OUTPUT-FILE.

于 2008-09-26T12:52:02.090 回答
25

在 OSX(和 Solaris,显然)上,该mkfile命令也可用:

mkfile 10g big_file

这会生成一个名为“big_file”的 10 GB 文件。在这里找到了这种方法

于 2012-01-02T23:32:05.370 回答
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;
}

这种方法对于随后将文件映射到内存中特别有用。

使用以下命令检查文件的大小是否正确:

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

当心:

# du /tmp/foo.txt

可能会打印0,因为如果您的文件系统支持,它会被分配为稀疏文件。

另请参阅:man 2 openman 2 truncate

于 2008-10-28T23:17:08.850 回答
12

您可以将其中一些答案/dev/zero用作数据源。如果您的测试网络上传速度,如果您的应用程序正在执行任何压缩,这可能不是最好的主意,一个充满零的文件压缩得非常好。使用此命令生成文件

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

我可以压缩upload_test到大约 200 个字节。因此,您可以将自己置于您认为上传 10KB 文件但实际上要少得多的情况。

我建议使用/dev/urandom而不是/dev/zero. 我根本无法压缩/dev/urandom太多的输出。

于 2013-09-16T16:50:11.017 回答
11

你可以这样做:

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

将 100 替换为要写入的字节数。

于 2008-09-26T12:52:46.910 回答
9
dd if=/dev/zero of=my_file.txt count=12345
于 2008-09-26T12:52:19.687 回答
7

这将在当前目录中生成 4 MB 带有随机字符的文本文件,其名称为“4mb.txt”。您可以更改参数以生成不同的大小和名称。

base64 /dev/urandom | head -c 4000000 > 4mb.txt
于 2016-07-21T12:55:50.963 回答
7

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
于 2020-01-01T16:05:42.673 回答
5

有很多答案,但没有一个很好地解释了还能做什么。查看dd 的手册页,可以更好地指定文件的大小。

这将创建 /tmp/zero_big_data_file.bin 用零填充,大小为 20 兆字节:

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

这将创建 /tmp/zero_1000bytes_data_file.bin 填充零,大小为 1000 字节:

    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 *1000*1000, G =1024*1024*1024,以此类推 T、P、E、Z、Y。
于 2013-09-27T12:54:10.790 回答
3

作为 shell 命令:

< /dev/zero head -c 1048576 >  output
于 2012-10-24T18:25:31.770 回答