如何从命令行创建具有特定大小的文件?


Answers:


158

用途truncate

truncate -s 14M filename

来自man truncate

DESCRIPTION
   Shrink or extend the size of each FILE to the specified size

[...]

 -s, --size=SIZE
          set or adjust the file size by SIZE

注意:truncate您的系统可能不可用,例如在Mac OS X上默认未安装(但您可以轻松地安装它,例如使用macports)。在这些情况下,您可能需要使用ddhead代替。


2
哇。非常好,我不知道这一点。
n611x007

男人说了一切:截断-将文件大小缩小或扩展到指定大小
ssedano 2013年

12
的确很好。在touch不需要不过,你可以简单地运行truncate -s 14M filename它会创建filename直接。
terdon

酷...这正是我真正想要的...谢谢@
oliver

34
这似乎创建了一个稀疏文件,而下面的答案(使用“ dd”)却没有。我不知道这种差异是否对您很重要,但我想我会指出这一点
offby2013年

100

编辑:最简单的方法可能truncate是Ashutosh Vishwa Bandhu的答案,但正如@ offby1所指出的那样,它创建的稀疏文件可能不是您想要的。下面的解决方案创建普通的完整文件。


以下命令创建一个14MB的文件,名为foo

  1. fallocate(感谢@Breakthrough在评论中提出建议,并在下面对艾哈迈德·马苏德的回答也投了赞成票。)

    fallocate -l 14000000 foo
    

    该命令特别令人印象深刻,因为它truncate与所需文件大小一样快(瞬时)(不同于其他解决方案,后者对于大文件而言会很慢),并且可以创建普通文件,而不是稀疏文件:

    $ truncate -s 14MB foo1.txt 
    $ fallocate -l 14000000 foo2.txt 
    $ ls -ls foo?.txt 
        0 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:54 foo1.txt
    13672 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:55 foo2.txt
    
  2. 创建一个填充随机数据的文件

    dd if=/dev/urandom of=foo bs=14MB count=1
    

                                                                              要么

    head -c 14MB /dev/urandom > foo
    
  3. 创建一个充满\0s 的文件:

    dd if=/dev/zero of=foo.txt bs=14MB count=1
    

                                                                              要么

    head -c 14MB /dev/zero > foo
    
  4. 创建一个文件,其中填充了另一个文件的前14MB数据:

    head -c 14MB bar.txt > foo
    
  5. 创建一个文件,其中填充了另一个文件的最后14MB数据:

    tail -c 14MB bar.txt > foo
    

在以上所有示例中,14*1000*1000如果需要14*1024*1024,该文件将为,替换MBM。例如:

dd if=/dev/urandom of=foo bs=14M count=1
head -c 14M /dev/zero > foo

fallocate 仅以字节为单位,因此您必须这样做(14 * 1024 * 1024 = 14680064)

fallocate -l 14680064 foo

2
谢谢...这也将满足我创建所需大小文件的目的...
fasil

2
dd如果有更简单,破坏性较小的方法,我建议您不要使用。
侍酒师

3
@acolyte我也是。这就是每个dd解决方案都有一个非dd替代方案的原因。
terdon

1
Wiki条目说,即使dd(带有零)也将创建一个稀疏文件,不是吗?zh.wikipedia.org/wiki/Sparse_file
迈克尔

1
@Michael我检查了一下,只是为了确定,我的命令都没有产生稀疏文件。在dd维基页面上的命令是完全不同的,并且不使用/dev/zero。至于是否MMB更符合逻辑,把它上升与开发商。headtaildd的手册页都清楚地指出“ MB = 1000 * 1000,M = 1024 * 1024”。在其他* nixes上可能有所不同。
2013年

21
dd bs=1MB count=14 if=/dev/zero of=<yourfilename>

如果您自愿或无意中指定警告,dd警告将以无提示方式覆盖所有内容。确保您了解dd,例如。阅读时dd --help,您不必搞砸dd命令行,否则容易造成不可逆转的数据丢失- 甚至是全部丢失。

首先,if=输入文件of=输出文件。在运行命令之前,请始终仔细检查是否正确。:)


13

使用魔术dd;)手册页

$ dd if=/dev/zero of=output.dat  bs=1024  count=14336

导致14MB * 1024 = 14336KB或:

$ dd if=/dev/zero of=output.dat  bs=1MB  count=14

然后您将获得14mb output.dat文件,其中填充了零:D


8

这应该是最快的方法:

SEEK=$SIZE-1
dd if=/dev/zero of=outfile bs=1 seek=$SEEK count=1 

否则,只需编写一个快速且肮脏的C或perl程序,该程序将查找到确切位置并写入一个字节。这比将数据实际转储到块上快很多。

如果要避免文件稀疏,则可以在Linux(和其他系统)上使用fallocate -l <length>from util-linux

如果这不可用,并且您具有POSIX兼容系统,则可以使用posix_fallocate()库调用编写快速而肮脏的程序。posix_fallocate保证分配指定的范围,因此如果该范围成功返回,则在以后使用该范围时不会获得磁盘满的信息


6

尽管这dd是一种可移植的方法,但是命令mkfilexfs_mkfile是专门为此目的而编写的,并且速度更快:

mkfile size[b|k|m|g] filename
xfs_mkfile size[b|k|m|g] filename

问题在于这两个命令都不是通用的,因此它们不适用于编写可移植脚本。但是,如果我通过命令行进行交互操作,那么这些就是我使用的命令。

默认情况下,它们创建零填充文件,而不创建稀疏(或“有孔”)文件。它们都-n选择创建稀疏文件。


1

Perl还有另一个选择:

perl -e 'print "a" x 1024' > file.txt

这将创建1KB文件。用您喜欢的任何数字替换1024。

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.