如何在Linux中创建具有给定大小的文件?
问题的原因:在Linux系统中,有时候我们需要创建一个指定大小的文件。然而,使用普通的文件创建命令可能无法直接创建所需大小的文件,需要寻找其他解决方法。
解决方法:可以使用dd命令来创建指定大小的文件。具体的命令为:dd if=/dev/zero of=the_file bs=1 count=0 seek=12345
。该命令会在大多数Unix系统上创建一个具有“空洞”的文件,实际上不会将数据写入磁盘,也不会占用任何空间,直到有非零数据写入其中为止。
通过将count
参数设置为0,可以避免从文件大小中减去一个字节的操作。而bs * seek
则成为了文件的大小。
因此,要在Linux系统中创建一个指定大小的文件,可以使用dd命令,并根据需要调整seek
参数的值。
如何在Linux中创建指定大小的文件?
在Linux上,有几种方法可以创建指定大小的文件。其中两种常用的方法是使用truncate
命令和fallocate
命令。这两种方法都可以创建指定大小的文件,但是它们的实现方式有所不同。
首先,需要说明的是,在支持稀疏文件的文件系统上,truncate
命令会创建一个稀疏文件,而fallocate
命令不会。稀疏文件是一种文件,其中构成文件的分配单元在使用之前实际上并没有被分配。文件的元数据会占用一些空间,但很可能远远不到文件的实际大小。关于稀疏文件的优缺点,您可以查阅相关资源以获取更多信息。非稀疏文件会提前分配其块(分配单元),这意味着就文件系统而言,空间是被保留的。另外,fallocate
和truncate
都不会像dd
命令那样设置文件的内容为指定值,而是创建的文件的内容可能是创建时分配单元中存在的任何垃圾值,这种行为可能是期望的,也可能不是期望的。dd
命令最慢,因为它实际上会将指定的值或数据块写入整个文件流中。
因此,根据所使用的文件系统以及该文件系统对任何标准或规范的符合程度,这种行为可能会有所不同。因此,建议进行适当的研究,确保使用适当的方法。
如果要在OSX上运行此命令,则需要执行brew install coreutils
命令。这将在命令前添加一个gtruncate -s 10G foo
。希望对您有所帮助!
需要注意的是,fallocate
命令在NTFS
分区上似乎不起作用。
在我的系统(Ubuntu 16.04)上,fallocate
命令失败并留下一个0字节的文件,错误信息为fallocate: fallocate failed: Operation not supported
。而truncate
命令则用^@
(0x00
)填充文件。
无论是truncate
命令还是fallocate
命令都会创建稀疏文件,而dd
命令则创建预分配的文件(除非与seek=...
选项一起使用dd
命令)。这些文件在创建时速度较快(在支持的文件系统上),但在大量读写时需要更多的CPU和IO资源。
在经过测试的ext4文件系统上,truncate
命令似乎不会影响df
命令的输出。而fallocate
命令增加了已使用空间(在删除文件时减少)。因此,fallocate
命令正好符合我的需求。
通过使用truncate
命令或fallocate
命令,您可以轻松地创建指定大小的文件,并根据您的需求选择适当的方法。
如何在Linux中创建指定大小的文件?
有时候我们需要在Linux系统中创建一个指定大小的文件。下面提供了几种方法来实现这个目标。
对于小文件,我们可以使用以下命令:
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
这种方法比前一种更有效率,因为它可以一次性完成所有操作。
事实上,如果文件变得非常大,使用巨大的块大小会导致性能下降,因为它会在写入之前将相应数量的数据分配并读入内存中。如果bs
的值为4GiB这样的大小,你可能会遇到交换内存的问题。
还有一种方法是使用现有文件的开头(使用head -c file_size > desired_file
命令)或结尾(使用tail -c file_size > desired_file
命令)作为模板来创建新文件。这种方法会更快,并且生成的文件会比较随机。
使用dd
命令时,需要注意其参数的范围限制为2^32,因此如果要创建大于4GB的文件,可以使用以下技巧:dd if=/dev/zero of=test bs=1M count=
。
需要注意的是,当使用某些设备(如/dev/random
)时,dd
命令可能会提前终止,导致生成的文件大小小于预期。有关/dev/random
和/dev/urandom
之间的区别,请参考这里的说明:unix.stackexchange.com/questions/324209/…。
关于2^32
的限制是否有文档记录?以及dd if=/dev/zero of=test bs=1M count=
命令是基于经验还是其他来源?谢谢。