如何在Linux中创建具有给定大小的文件?

Gru*_*eck 142 linux command-line

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

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

Ily*_*tov 176

dd if=/dev/zero of=upload_test bs=file_size count=1
Run Code Online (Sandbox Code Playgroud)

哪里file_size是你的测试文件的字节大小

  • `dd`的值限制为2 ^ 32,因此要创建一个大于4 GB的文件,有一个技巧:`dd if =/dev/zero of = test bs = 1M count = <size in megabytes> . (29认同)
  • 实际上,一旦它变得非常大,使用巨大的块大小会表现得更糟,因为它会在写入之前分配并读取该数量到内存中.如果这是像bs = 4GiB这样的东西,你可能最终会交换掉. (10认同)
  • 有关更好,更快的方法,请参阅下一个答案 (2认同)
  • @elegantdice不清楚下一个答案,他们可以改变自己的立场 (2认同)

jør*_*sen 153

请,现代更容易,更快.在Linux上,(选择一个)

truncate -s 10G foo
fallocate -l 5G bar
Run Code Online (Sandbox Code Playgroud)

需要被指出truncate的文件系统上支持稀疏文件将创建一个稀疏文件,fallocate不会.稀疏文件是指组成文件的分配单元在使用之前未实际分配的文件.然而,该文件的元数据占用相当大的空间,但可能没有接近文件的实际大小.您应该查阅有关稀疏文件的资源以获取更多信息,因为此类文件有优点和缺点.非稀疏文件具有提前分配的块(分配单元),这意味着只要文件系统看到空间就保留空间.此外fallocate,也truncate不会将文件的内容到指定的值一样 dd,与分配的文件,而不是内容fallocate或者truncate可能是建立时,在配房存在任何垃圾的价值和这种行为可能会或可能不会被期望.它dd是最慢的,因为它实际上将数据的值或块写入整个文件流,如其命令行选项所指定的那样.

此行为可能会有所不同 - 取决于所使用的文件系统以及该文件系统与任何标准或规范的一致性.因此,建议进行适当的研究以确保使用适当的方法.

  • fallocate对我来说似乎很好.它创建一个正确大小的文件. (6认同)
  • 这是这个问题的最佳答案.truncate/fallocate不需要很长时间,因为它不会写入所有文件的块.但是,如果你要将结果文件上传到某个地方,它会读取整个事件的零. (5认同)
  • 如果你想在OSX下运行它,那么你需要这样做:`brew install coreutils`.这将在命令前面添加一个**g**,所以你必须像这样运行它:`gtruncate -s 10G foo`.希望这可以帮助! (4认同)

Bri*_*ian 40

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

dd if=/dev/zero of=the_file bs=1 count=0 seek=12345
Run Code Online (Sandbox Code Playgroud)

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

  • 使用`count = 0`,`bs*seek`成为文件大小 (3认同)

ste*_*eve 21

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

mkfile 10g big_file
Run Code Online (Sandbox Code Playgroud)

这使得一个名为"big_file"的10 GB文件成为可能.在这里找到这种方法.


Gru*_*eck 20

使用此命令:

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

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

  • 我不得不谷歌的答案,所以我把它放在这里,所以它可以讨论并保持最新...你知道,整个网站的重点? (9认同)
  • 谢谢保罗.虽然我对这些问题并不感到困扰,但我对我在Google上发现的事情感到困扰,除非我在这里提出要求,否则我可能会以某种方式存在缺陷.如果他们认为我正在嫖娼,那么人们应该随意让我的Q/A社区拥有,*耸耸肩*. (3认同)
  • 我知道人们正在投票给@Grundlefleck for XP whoring,但他确实有一个观点 - Jeff和Joel设想的使用这个网站的方法之一是为你刚发现的东西提出问题和答案. (2认同)
  • 引用常见问题解答"请求和回答你自己的编程问题也很好,但假装你是在Jeopardy上:用问题的形式说出来." (2认同)

Ben*_*gel 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

# du -B1 --apparent-size /tmp/foo.txt
Run Code Online (Sandbox Code Playgroud)

小心:

# du /tmp/foo.txt
Run Code Online (Sandbox Code Playgroud)

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

另见:男子2打开,男子2截断


dsm*_*dsm 10

你可以这样做:

[dsm@localhost:~]$ perl -e 'print "\0" x 100' > filename.ext
Run Code Online (Sandbox Code Playgroud)

用您要写入的字节数替换100的位置.


dev*_*vin 10

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

 dd if=/dev/zero of=upload_test bs=10000 count=1
Run Code Online (Sandbox Code Playgroud)

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

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


Pau*_*lin 9

dd if=/dev/zero of=my_file.txt count=12345
Run Code Online (Sandbox Code Playgroud)

  • 请记住,dd的默认块大小为512字节,因此该命令将使文件大小为12345*512字节. (4认同)

qin*_*qin 9

fallocate如果您不想等待磁盘,请使用。

例子:

fallocate -l 100G BigFile
Run Code Online (Sandbox Code Playgroud)

用法:

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
Run Code Online (Sandbox Code Playgroud)


BЈо*_*вић 6

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

这将创建充满零的 /tmp/zero_big_data_file.bin ,其大小为 20 MB :

dd if=/dev/zero of=/tmp/zero_big_data_file.bin  bs=1M count=20
Run Code Online (Sandbox Code Playgroud)

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

dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1kB count=1
Run Code Online (Sandbox Code Playgroud)

或者

dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1000 count=1
Run Code Online (Sandbox Code Playgroud)
  • 在所有示例中,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 依此类推。


Ber*_*y92 6

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

base64 /dev/urandom | head -c 4000000 > 4mb.txt
Run Code Online (Sandbox Code Playgroud)