问题描述
如何从终端创建一个无限重复一组单词的文件?我需要它来创建一个用于解析目的的大文件,例如 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.txt
将foo.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” 差不多。