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

fas*_*sil 127 linux command-line

如何创建一个文件(例如使用touch命令或其他类似方式),但具有特定大小(例如 14 MB)?

用例是使用各种文件大小测试 FTP。如果我们可以创建具有特定大小的文件,则验证 FTP 传输等将很有用。

小智 166

使用truncate

truncate -s 14M filename
Run Code Online (Sandbox Code Playgroud)

来自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
Run Code Online (Sandbox Code Playgroud)

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

  • 这似乎创建了一个 [稀疏文件](http://en.wikipedia.org/wiki/Sparse_file),而下面的答案(使用“dd”)没有。我不知道差异对你来说是否重要,但我想我会指出 (34认同)
  • 的确很好。虽然不需要`touch`,你可以简单地运行`truncate -s 14M filename` 它会直接创建`filename`。 (12认同)
  • 哇。非常好,我不知道这个。 (2认同)

ter*_*don 100

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


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

  1. fallocate(感谢@Breakthrough,他在评论中提出了建议,并在下面对Ahmed Masud 的回答进行了投票,其中也提到了这一点。)

    fallocate -l 14000000 foo
    
    Run Code Online (Sandbox Code Playgroud)

    这个命令特别令人印象深刻,因为它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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个填充随机数据的文件

    dd if=/dev/urandom of=foo bs=14MB count=1
    
    Run Code Online (Sandbox Code Playgroud)

                                                                              或者

    head -c 14MB /dev/urandom > foo
    
    Run Code Online (Sandbox Code Playgroud)
  3. 创建一个用\0s填充的文件:

    dd if=/dev/zero of=foo.txt bs=14MB count=1
    
    Run Code Online (Sandbox Code Playgroud)

                                                                              或者

    head -c 14MB /dev/zero > foo
    
    Run Code Online (Sandbox Code Playgroud)
  4. 创建一个填充了另一个文件的前 14MB 数据的文件:

    head -c 14MB bar.txt > foo
    
    Run Code Online (Sandbox Code Playgroud)
  5. 创建一个填充了另一个文件的最后 14MB 数据的文件:

    tail -c 14MB bar.txt > foo
    
    Run Code Online (Sandbox Code Playgroud)

在上述所有示例中,14*1000*1000如果需要14*1024*1024,文件将替换MBM. 例如:

dd if=/dev/urandom of=foo bs=14M count=1
head -c 14M /dev/zero > foo
Run Code Online (Sandbox Code Playgroud)

fallocate 只处理字节,所以你必须做 (14*1024*1024=14680064)

fallocate -l 14680064 foo
Run Code Online (Sandbox Code Playgroud)

  • @acolyte 我也是。这就是为什么每个 `dd` 解决方案都有一个非 dd 替代方案。 (3认同)
  • 谢谢...这也将满足我创建所需大小的文件的目的... (2认同)
  • 如果有更简单、潜在破坏性较小的方法,我建议不要使用 `dd`。 (2认同)

n61*_*007 21

dd bs=1MB count=14 if=/dev/zero of=<yourfilename>
Run Code Online (Sandbox Code Playgroud)

WARNING dd将默默地覆盖您有权写入的任何内容,如果您有意或无意地指定它。确保你理解dd,例如。通过阅读dd --help,您不会搞砸 dd 命令行,否则您很容易造成不可逆转的数据丢失 -甚至全部.

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


mir*_*vic 13

使用魔法dd;)手册页

$ dd if=/dev/zero of=output.dat  bs=1024  count=14336
Run Code Online (Sandbox Code Playgroud)

导致 14MB*1024 = 14336KB,或:

$ dd if=/dev/zero of=output.dat  bs=1MB  count=14
Run Code Online (Sandbox Code Playgroud)

你会得到 14mb 的 output.dat 文件,用零填充:D


Ahm*_*sud 8

这应该是最快的方法:

SEEK=$SIZE-1
dd if=/dev/zero of=outfile bs=1 seek=$SEEK count=1 
Run Code Online (Sandbox Code Playgroud)

否则,只需编写一个快速而肮脏的 C 或 perl 程序,该程序会搜索确切位置并写入单个字节。这比实际将数据转储到块上要快得多。

如果你想避免稀疏文件,那么在 Linux(可能还有其他系统)上你可以使用fallocate -l <length>from util-linux.

如果这不可用,并且您有一个符合 POSIX 的系统,那么您可以使用 posix_fallocate() 库调用编写一个快速而肮脏的程序。posix_fallocate 保证指定范围的分配,因此如果它成功返回,您将不会在后续使用该范围时磁盘已满


Old*_*Pro 7

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

mkfile size[b|k|m|g] filename
xfs_mkfile size[b|k|m|g] filename
Run Code Online (Sandbox Code Playgroud)

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

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