如何快速创建一个大文件?

有没有一种快速简便的方法来创建一个大小为2 GB的文件呢?
3个回答

零填充方法(此处修改以避免潜在的内存瓶颈)在SSD上创建一个10 GB的文件需要17秒,并导致Ubuntu的图形界面无响应。

$ time sh -c 'dd if=/dev/zero iflag=count_bytes count=10G bs=1M of=large; sync'
10240+0 records in
10240+0 records out
10737418240 bytes (11 GB, 10 GiB) copied, 17.2003 s, 624 MB/s

real    0m17.642s
user    0m0.008s
sys     0m9.404s
$ du -B 1 --apparent-size large
10737418240     large
$ du -B 1 large
10737422336     large

fallocate通过直接操作文件的分配磁盘空间,可以立即创建大文件:

$ time sh -c 'fallocate -l 10G large; sync'

real    0m0.038s
user    0m0.000s
sys     0m0.016s
$ du -B 1 --apparent-size large
10737418240     large
$ du -B 1 large
10737422336     large
truncate还能立即工作,并且创建稀疏文件,直到稍后写入数据之前不会占用实际磁盘空间。
$ time sh -c 'truncate -s 10G large; sync'

real    0m0.014s
user    0m0.000s
sys     0m0.004s
$ du -B 1 --apparent-size large
10737418240     large
$ du -B 1 large
0       large

dd ... bs=2G count=1 一次性将2 GB的数据读入内存(使用一次 read(2) 调用)。如果你的内存压力较大,这可能不是一个好的选择。更小的块可能会更快,因为它意味着更少的分页操作。 - claymation

一个简单的方法是使用dd命令来写入一个全是零的文件。
dd if=/dev/zero of=outputFile bs=2G count=1
  • if = 输入文件
  • of = 输出文件
  • bs = 字节

如果您想要计算机(1024*1024*1024)千兆字节,请在大小参数中使用 G,如果您想要人类(1000*1000*1000)千兆字节,请使用 GB。


1我只想补充一下,如果你不想要全部都是零的话,你可以选择if=/dev/random。 - Denwerko
尽管/dev/random需要更多时间。 - con-f-use
10使用/dev/random会花费非常长的时间。在这种情况下,请使用/dev/urandom(它是非阻塞的,但不能保证具有相同级别的随机性)。从任何一个设备中提取2 GB的数据几乎肯定会完全耗尽系统的熵,因此在此之后一段时间内不要进行任何加密操作。 - user

ftp://ftp.fsf.hu/testfiles/maketestfiles.sh

或者,Seek 是您想要的文件大小(以字节为单位)减去 1。
dd if=/dev/zero of=filename.big bs=1 count=1 seek=1048575 # 1 MByte

dd if=/dev/zero of=filename.big bs=1 count=1 seek=10485759 # 10 MByte

dd if=/dev/zero of=filename.big bs=1 count=1 seek=104857599 # 100 MByte

dd if=/dev/zero of=filename.big bs=1 count=1 seek=1073741823 # 1024 MByte

dd if=/dev/zero of=filename.big bs=1 count=1 seek=42949672959 # 40960 MByte