【问题标题】:How to create a file with a given size in Linux?如何在 Linux 中创建给定大小的文件?
【发布时间】:2010-09-13 10:43:59
【问题描述】:

出于测试目的,我必须生成一个特定大小的文件(以测试上传限制)。

在 Linux 上创建一定大小文件的命令是什么?

【问题讨论】:

标签: linux command-line


【解决方案1】:

使用这个命令:

dd if=$INPUT-FILE of=$OUTPUT-FILE bs=$BLOCK-SIZE count=$NUM-BLOCKS

要创建一个大(空)文件,请设置$INPUT-FILE=/dev/zero
文件的总大小为$BLOCK-SIZE * $NUM-BLOCKS
创建的新文件将是$OUTPUT-FILE

【讨论】:

  • 你为什么问这个问题?
  • 我不得不在谷歌上找到答案,所以我把它放在这里,这样可以讨论并保持最新......你知道,整个网站的重点吗?
  • 我知道人们正在投票给@Grundlefleck 否决 XP 嫖娼,但他确实有一个观点 - Jeff 和 Joel 所设想的使用该网站的方法之一是提出问题并回答某事你刚刚发现。
  • 谢谢保罗。虽然我对这些观点并不那么在意,但我对我在 Google 上找到的东西感到困扰,这些东西可能存在某种缺陷,除非我在这里问过,否则我永远不会发现。如果人们认为我在嫖娼,他们应该随时让我的 Q/A 社区拥有,耸耸肩
  • 引用常见问题解答中的“提出并回答您自己的编程问题也很好,但假装您处于危险境地:以问题的形式表达它。”
【解决方案2】:
dd if=/dev/zero of=my_file.txt count=12345

【讨论】:

  • 记住dd的默认块大小是512字节,所以这个命令会使文件大小为12345*512字节。
【解决方案3】:

你可以这样做:

[dsm@localhost:~]$ perl -e 'print "\0" x 100' > filename.ext

将 100 替换为要写入的字节数。

【讨论】:

  • 实际填充字节也是如此。我需要 "\xff" 并且工作正常。谢谢! :)
【解决方案4】:

对于小文件:

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 之类的东西,你可能最终会交换。
  • dd 的值限制为 2^32,因此要创建大于 4 GB 的文件,有一个技巧:dd if=/dev/zero of=test bs=1M count=<size in megabytes>
  • 查看下一个答案以获得更好、更快的方法
  • @elegantdice 不清楚下一个答案是什么,他们可以改变他们的立场
  • @vladkras true... 我的意思是 jørgensen 回答、截断和分配
【解决方案5】:

只是为了跟进Tom's的帖子,你也可以使用dd创建稀疏文件:

dd if=/dev/zero of=the_file bs=1 count=0 seek=12345

这将在大多数 unix 上创建一个带有“洞”的文件 - 数据实际上不会写入磁盘,或占用任何空间,直到写入非零的内容。

【讨论】:

  • 设置 count=0 可以避免从文件大小中减去一个字节。
  • count=0bs * seek成为文件大小
【解决方案6】:

您可以通过编程方式完成:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main() {
    int fd = creat("/tmp/foo.txt", 0644);
    ftruncate(fd, SIZE_IN_BYTES);
    close(fd);
    return 0;
}

这种方法对于后续mmap文件进入内存特别有用。

使用以下命令检查文件大小是否正确:

# du -B1 --apparent-size /tmp/foo.txt

小心:

# du /tmp/foo.txt

可能会打印 0,因为如果您的文件系统支持,它会分配为 Sparse file

另请参阅:man 2 openman 2 truncate

【讨论】:

    【解决方案7】:

    在 OSX(显然还有 Solaris)上,mkfile 命令也可用:

    mkfile 10g big_file
    

    这会生成一个名为“big_file”的 10 GB 文件。找到了这个方法here.

    【讨论】:

    • 这对于诸如 truncatefallocate 命令不可用的 OS X 等情况很有用。 dd 也可以按上述方式工作,尽管它是 m 表示兆字节,而不是 M
    • 错误:这会创建一个 10 GiB 文件 (=~ 10,7 GB)。
    【解决方案8】:

    拜托,现代更容易,更快。在 Linux 上,(选择一个)

    truncate -s 10G foo
    fallocate -l 5G bar
    

    需要声明,支持稀疏文件的文件系统上的truncate 将创建一个稀疏文件,而fallocate 不会。稀疏文件是组成文件的分配单元在使用之前实际分配的文件。然而,文件的元数据占用一些相当大的空间,但可能不会接近文件的实际大小。您应该查阅有关稀疏文件的资源以获取更多信息,因为这种类型的文件有利有弊。非稀疏文件的块(分配单元)是提前分配的,这意味着只要文件系统看到它,就会保留空间。同样fallocatetruncate 不会将文件的内容设置为指定值like dd,而是分配有fallocatetruncate 的文件的内容可以是任何创建期间分配单元中存在的垃圾值,并且可能需要也可能不需要此行为。 dd 是最慢的,因为它实际上将值或数据块写入使用其命令行选项指定的整个文件流。

    这种行为可能会有所不同 - 取决于使用的文件系统以及该文件系统是否符合任何标准或规范。因此,建议进行适当的研究以确保使用适当的方法。

    【讨论】:

    • 我试过truncate。它使用上面的语法生成了一个大小为零的文件。 fallocate 的“手册页”表示它创建的文件充满了空的 space 而不是数据。似乎对于某些预期的情况,例如“复制一个 1G 文件需要多长时间”,它并没有用处。
    • fallocate 似乎对我来说很好用。它会创建一个大小合适的文件。
    • 这是这个问题的最佳答案。 truncate/fallocate 不需要很长时间,因为它不会写入所有文件的块。但是,如果您随后将生成的文件上传到某个地方,它会读取整个内容的零。
    • 如果你想在 OSX 下运行它,那么你需要这样做:brew install coreutils。这将在命令前面添加一个 g,因此您必须像这样运行它:gtruncate -s 10G foo。希望这会有所帮助!
    • 似乎在NTFS分区上不起作用。
    【解决方案9】:

    作为shell命令:

    < /dev/zero head -c 1048576 >  output
    

    【讨论】:

      【解决方案10】:

      其中一些答案让您使用/dev/zero 作为数据源。如果您的测试网络上传速度,如果您的应用程序正在执行任何压缩,这可能不是最好的主意,一个充满零的文件真的可以很好地压缩。使用此命令生成文件

       dd if=/dev/zero of=upload_test bs=10000 count=1
      

      我可以将upload_test 压缩到大约 200 字节。因此,您可以将自己置于您认为上传 10KB 文件但实际上要少得多的情况。

      我建议使用/dev/urandom 而不是/dev/zero。我根本无法压缩/dev/urandom 的输出。

      【讨论】:

      • 我的嵌入式系统没有/dev/zero,所以/dev/urandom就好了。
      【解决方案11】:

      有很多答案,但没有一个很好地解释了还能做什么。查看man pages for dd,可以更好地指定文件的大小。

      这将创建填充零的 /tmp/zero_big_data_file.bin,大小为 20 兆字节:

          dd if=/dev/zero of=/tmp/zero_big_data_file.bin  bs=1M count=20
      

      这将创建填充零的 /tmp/zero_1000bytes_data_file.bin,大小为 1000 字节:

          dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1kB count=1
      

          dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1000 count=1
      

      • 在所有示例中,bs 是块大小,count 是块数
      • BLOCKS 和 BYTES 后面可以跟以下乘法后缀:c =1, w =2, b =512, kB =1000, K =1024, MB =1000*1000, M =1024*1024, xM =M GB =1000*1000*1000,G =1024*1024*1024,以此类推为 T、P、E、Z、Y。

      【讨论】:

        【解决方案12】:

        这将在当前目录中生成 4 MB 带有随机字符的文本文件,其名称为“4mb.txt” 您可以更改参数以生成不同的大小和名称。

        base64 /dev/urandom | head -c 4000000 > 4mb.txt
        

        【讨论】:

          【解决方案13】:

          如果您不想等待磁盘,请使用fallocate

          例子:

          fallocate -l 100G BigFile
          

          用法:

          Usage:
           fallocate [options] <filename>
          
          Preallocate space to, or deallocate space from a file.
          
          Options:
           -c, --collapse-range remove a range from the file
           -d, --dig-holes      detect zeroes and replace with holes
           -i, --insert-range   insert a hole at range, shifting existing data
           -l, --length <num>   length for range operations, in bytes
           -n, --keep-size      maintain the apparent size of the file
           -o, --offset <num>   offset for range operations, in bytes
           -p, --punch-hole     replace a range with a hole (implies -n)
           -z, --zero-range     zero and ensure allocation of a range
           -x, --posix          use posix_fallocate(3) instead of fallocate(2)
           -v, --verbose        verbose mode
          
           -h, --help           display this help
           -V, --version        display version
          

          【讨论】:

            猜你喜欢
            • 2011-12-19
            • 2018-05-21
            • 1970-01-01
            • 2012-06-21
            • 1970-01-01
            • 1970-01-01
            • 2020-09-14
            • 2016-11-27
            相关资源
            最近更新 更多