当前位置: 首页>>技术教程>>正文


如何从终端创建一个无限重复一组单词的文件?

问题描述

如何从终端创建一个无限重复一组单词的文件?我需要它来创建一个用于解析目的的大文件,例如 2-4GB 大小。目前我正在手动将粘贴行复制到同一个文件中以增加大小。

最佳答案

有一种简单的方法可以使用 yes 命令多次重复一行:

yes we have no bananas | head -n 10000 > out.txt

将导致 out.txt 包含 10,000 行都说“我们没有香蕉”。


要将输出限制为精确的字节数,请使用 head-c 选项而不是 -n 。例如,这正好生成 10 kB 的文本:

yes we have no bananas | head -c 10000 > out.txt

次佳答案

Perl 有漂亮的 x 运算符:

$ perl -e 'print "foo\n" x 5'
foo
foo
foo
foo
foo

所以,作为一个简单的解决方案,你可以只写几百万次你的行。例如,此命令创建了一个 3G 文件:

perl -e 'print "This is my line\n" x 200000000' > file

如果您需要指定确切的大小(在这种情况下为 2 GiB),您可以执行以下操作:

perl -e 'use bytes; while(length($str)<2<<20){ $str.="This is my line\n"} print "$str\n"' > file

第三种答案

我不建议无限重复文本,但你可以像这样用 python 制作一个~2GB 的重复文本文件……

python3 -c 'with open("bigfile", "w") as f: f.write(("hello world "*10+"\n")*2*10**7)'

这将打印“hello world” 10 次并换行,然后重复 20,000,000 次,将结果写入文件 bigfile 。如果你所有的字符都是ASCII,那么每个字符都是一个字节,所以根据你想写的内容适当地计算……

你的cpu可能是自己的。如果我尝试执行超过 10,000,000 行,我的内存就会用完……

我正在运行烤面包机

第四种答案

  • 将要重复的单词集放在一个文件中,例如source.txt 。获取 source.txt 的大小,以字节为单位,例如经过:

     stat -c '%s' source.txt
    
  • 确定目标文件的大小,例如destination.txt , 2 GB 或 4 GB 或其他。以字节为单位转换大小。

  • 将目标文件大小除以源文件大小。 bash 不能做浮点运算,但在这种情况下不需要。

  • 使用 for 构造重复 cat source.txt 运算除法结果次数。这将最接近您可以通过重复获得的目标文件大小。操作的输出保存在 destination.txt 中。

例如,假设 source.txt 是 30 字节,我们要创建一个 2 GB 的文件,我们需要:

for ((i=0; i<=((16777216/30)); i++)); do cat source.txt; done >destination.txt

这里我在初始化时通过 ((16777216/30)) 设置上限;你可以得到结果并将其也放在这里。

手术需要一些时间; source.txt 越大,所需的时间就越少。

第五种答案

您还可以使用 while 循环。

示例:foo.txt 的内容(这是您的来源):

foo
bar
foobar

bar.txt 为空(这是您的目标文件)。您现在可以运行以下循环将 foo.txt 的内容多次写入 bar.txt

while [ $(stat --format "%s" bar.txt) -lt 150 ] 
do 
    cat foo.txt >> bar.txt
done

解释:

  • stat --format "%s" bar.txt 以字节为单位显示 bar.txt 的大小。

  • while [ $(stat --format "%s" bar.txt) -lt 150 ] 将重复以下操作,直到达到目标大小(在本例中为 150 字节)。

  • cat foo.txt >> bar.txtfoo.txt 的内容追加到 bar.txt

第六种答案

首先发出命令:

dd if=/dev/urandom of=file.txt bs=2048 count=10

将在大小为 bs*count 随机字节的路径上创建一个文件,在我们的例子中为 2048*10 = 20Kb。可以根据要求更改。

cat - > file.txt

此命令将 STDIN 重定向到文件,因此您需要输入两行,然后按 Ctrl+D。然后,您将需要运行以下命令:

for i in {1..n}; do cat file.txt file.txt > file2.txt && mv file2.txt file.txt; done

其中 n 是一个整数。通过复制原始的两行,这将创建一个包含 2^(n+1) 行的文件。因此,要创建一个包含 16 行的文件,您将执行以下操作:

for i in {1..3}; do cat file.txt file.txt > file2.txt && mv file2.txt file.txt; done

这里还有一些数字可以帮助您入门:

n=15 will give you 65536 lines (if the original two lines were 'hello' and 'world' the file will be 384Kb)
n=20 will give you 2097152 lines (12Mb file with 'hello' and 'world' as the two starting lines)
n=25 will give you 67108864 lines (384Mb file with 'hello' and 'world' as the two starting lines)

第七种答案

FIFO 可能是您正在寻找的。您可以通过 process subtitution 将 shell 命令的结果与它联系起来,而不是使用给定的文件调用程序,程序会将其输出视为纯文本文件。这里的好处是您不再受磁盘空间的限制,因此您可以达到原本不可能的文件大小,只要您的程序不需要先缓冲整个文件并且可以逐行解析它。例如,使用@hobbs 的回复来生成内容:

wc -c <(yes we have no bananas | head -n 5000000000)

这为我提供了一个 95 GB 的文件(根据 wc),无需占用 HDD 空间,几乎没有任何 RAM,足以在读取命令之前缓冲命令返回的内容。这与您将获得的 “infinitely” 差不多。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/12710.html,未经允许,请勿转载。