创建一个包含大量零字节的测试文件


25

我知道如何创建一个空文件:

touch /var/tmp/nullbytes

但是如何使用bash在命令行上创建一个仅包含nullbytes的1MB文件?



1
+1。有趣的问题。有人可以详细说明在哪种情况下需要这样的文件吗?
肯特·帕瓦尔

1
我需要它来模拟chkrootkit的崩溃:unix.stackexchange.com/questions/86866/...
rubo77

Answers:


56

使用GNU truncate

truncate -s 1M nullbytes

(假设nullbytes事先不存在)将创建一个1兆字节的稀疏文件。这是一个看起来似乎充满零的文件,但它不占用磁盘上的任何空间。

没有truncate,您可以dd改用:

dd bs=1048576 seek=1 of=nullbytes count=0

(在某些dd实现中,您可以将替换为1048576 1M

如果希望在Linux和某些文件系统上分配磁盘空间,则可以执行以下操作:

fallocate -l 1M nullbytes

这样就分配了空间,而没有实际将数据写入磁盘(该空间已保留,但标记为未初始化)。

dd < /dev/zero bs=1048576 count=1 > nullbytes

实际上将零写入磁盘。这是效率最低的,但是如果您需要驱动器在访问该文件时旋转,那么这就是您要使用的驱动器。

或@mikeserv欺骗dd生成NUL字节的方法:

dd bs=1048576 count=1 conv=sync,noerror 0> /dev/null > nullbytes

使用GNU的一种替代方法,head它无需指定块大小(1M可以,但是10G则不需要):

head -c 1M < /dev/zero > nullbytes

或获得进度条:

pv -Ss 1M < /dev/zero > nullbytes

请勿truncate用于创建用作交换卷的空文件……这将不起作用!请dd在这种情况下使用。
Elias Probst

1
@EliasProbst,ITYM 从/ dev /零,而不是复制不使用稀疏文件dd可以创建稀疏文件,就像我展示的一样。
斯特凡Chazelas

2
fallocate是创造,因为它保留了空间,并快速的最好和快速的方式,但它并没有刻意去写什么(stackoverflow.com/questions/257844/...
curratore

...或bs=1kx1k。或<&1 dd bs=1kx1k conv=sync,noerror count="$rpt" | cat >file直接写入磁盘的东西。但是,强制读取错误可能会损失多少效率,并不是100%。
mikeserv

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.