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


Answers:


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

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


哦,这可能比我的方法更有效,因为它可以一步完成。好主意。
Paul Tomblin

10
实际上,一旦块变得很大,使用大块大小的性能就会差很多,因为它将在写入之前将其分配并读取到内存中。如果这是bs = 4GiB之类的东西,您可能最终会交换。
布赖恩

35
dd值的上限为2 ^ 32,因此要创建一个大于4 GB的文件,有一个技巧: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不会。稀疏文件是组成文件的分配单元只有在使用后才真正分配的文件。但是,文件的元数据占用一些相当大的空间,但可能不会接近文件的实际大小。您应该查阅有关稀疏文件的资源,以获取更多信息,因为这种类型的文件有其优点和缺点。非稀疏文件会提前分配其块(分配单位),这意味着在文件系统看到的范围内,空间已保留。此外fallocate,也truncate不会将文件的内容到指定值 dd,而是分配给文件的内容,fallocate或者该文件的内容truncate可以是创建期间分配单元中存在的任何垃圾值,并且可能不需要,也可能不需要此行为。这dd是最慢的,因为它实际上按照其命令行选项的指定将值或数据块写入整个文件流。

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


我试过了truncate。它使用上面的语法生成了一个大小为零的文件。的“手册页” fallocate表示创建的文件充满了空白space而不是数据。在某些预期情况下,例如“复制1G文件需要多长时间”,这似乎没有用。
马克·斯托斯伯格

6
fallocate似乎对我来说很好。它创建一个正确大小的文件。
Aater Suleman 2012年

5
这是对这个问题的最佳答案。truncate / fallocate不会花费很长时间,因为它不会写入文件的所有块。但是,如果您要将生成的文件上传到某个地方,则整个文件的读数为零。
Mike Andrews 2014年

4
如果要在OSX下运行此程序,则需要执行以下操作:brew install coreutils。这将在命令前面添加g,因此您必须像这样运行它:gtruncate -s 10G foo。希望这可以帮助!
DerekE 2015年

似乎在NTFS分区上不起作用。
eloyesp

40

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

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

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


设置count = 0可以避免必须从文件大小中减去一个字节。
andrewdotn

3
count=0bs * seek成为文件大小
Jayen 2012年

24

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

mkfile 10g big_file

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


这是情况下,如OS X,其中有用truncatefallocate命令不可用。dd尽管它m用于兆字节,但也如上所述,它也可以工作M
user535673 2015年

错误:这会创建一个10 GiB文件(=〜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


你为什么问这个问题?
亨利·B

9
我必须向Google寻求答案,所以我将其放在此处,以便可以进行讨论并保持最新状态……您知道吗,整个网站的重点?
Grundlefleck

2
我知道人们在投票反对XP妓女@Grundlefleck,但他确实有一点要说-Jeff和Joel所设想的使用此网站的方法之一是对刚发现的问题进行问答。
Paul Tomblin

3
谢谢保罗。尽管我不太担心要点,但我对在Google上发现的东西感到不安,除非我在这里询问,否则它们可能会以某种我永远不会发现的方式存在缺陷。如果人们以为我是妓女,耸耸肩,人们应该随意让我的Q / A社区所有。
Grundlefleck

2
引用常见问题的说法:“问和回答自己的编程问题也很好,但假装您正处于危险之中:以问题的形式表达它。”
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;
}

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

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

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

小心:

# du /tmp/foo.txt

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

另请参见:man 2打开man 2截断


10

你可以做:

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

用要写入的字节数替换100。


以及实际的填充字节也是如此。我需要“ \ xff”并且工作正常。谢谢!:)

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 2014年

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

4
请记住,dd的默认块大小为512字节,因此此命令将使文件大小为12345 * 512字节。
没人

4

有很多答案,但是没有一个很好的解释其他可以做什么。展望手册页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是块数
  • 块和字节后面可以跟以下乘法后缀: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。


3

这将在当前目录中生成4 MB的文本文件,该文件具有随机字符,其名称为“ 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.