【问题标题】:Fill a file with a repeated constant value?用重复的常量值填充文件?
【发布时间】:2018-04-28 19:50:22
【问题描述】:

我想使用标准实用程序而不是编译代码来有效地用常量值填充文件,重复 N 次。在简单版本中,值是单个字节;在复杂版本中 - 任意字符串。

注意:

  • 如果值为 0,我们有 dd if=/dev/zero of=/path/to/file bs=XXX count=YYY 对应 XXX 和 YYY 的适当值。
  • 显然,我们可以通过 echo $value >> file 循环执行此操作,但这应该非常慢。

【问题讨论】:

  • 这个回答stackoverflow.com/a/5349842/7411306有帮助吗?
  • 为什么需要这样的文件?在需要从中读取数据的程序中生成此类数据可能会更有效
  • @chepner:假设我不控制程序。
  • 您想要yes 程序吗?除了自动响应一系列提示之外,我无法想象哪个程序需要重复值的来源。
  • @chepner:嗯,这确实涵盖了一些用例,见下文。

标签: bash shell file-io replicate


【解决方案1】:

我们来

value_to_replicate="whatever"
file_length=65536
output_file="/path/to/file"

例如。

根据@dmadic 的建议,我们可以这样做:

bash -c "printf ${value_to_replicate}%.0s {1..${file_length}} > $output_file"

(如果我不“包装”最终命令,${file_length} 的扩展就会出现问题)。这在我的系统上的吞吐量约为 0.6 秒/MB。

如果字符串以换行符结尾,事情就变得简单了:

yes "$value_to_replicate" | head -$file_length > $output_file

如果字符串没有换行符,我们也可以这样做:

yes "$value_to_replicate" | head -$file_length | tr -d '\n' > $output_file

【讨论】:

    【解决方案2】:

    您可以按如下方式使用Perl

    time perl -e 'print "Hello"x1000000000' > /dev/null
    
    real    0m2.930s
    user    0m1.778s
    sys     0m1.151s
    

    所以,3 秒内 5GB。

    【讨论】:

    • 打印成真实文件时需要计时。另外,请注意没有附加换行符。
    • 如果我在打印到真实文件时计时,它会受到磁盘速度的影响,而我显示的是命令实现的真实持续带宽。如果您想要换行符,只需将它们放在您的字符串中! print "Hello\n" - 你说的是任意,不受必须以换行符结尾的限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2021-05-22
    • 1970-01-01
    • 2018-10-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多