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


19

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


1
我希望看到一个使用特殊的unix文件的答案,因此它实际上不会占用该空间。那可能吗?
DélissonJUNIO

1
您是说真正无限的东西mkfifo huge.tmp; while true; do yes "a dummy line" > huge.tmp; done吗?
Boldewyn

Answers:


50

有一种简单的方法可以重复很多行:

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

2
OP希望处理字节,而不是行。
heemayl

4
要指定字节限制,只需使用head -c 1000010 kB而不是head -n 1000010k行即可。
字节指挥官

@ByteCommander是的,但这不会阻止输出在行中间被截断。由于大小不必精确,我只想弄清楚行数即可得到正确的大小,然后四舍五入:)
hobbs

1
我同意,但是我不确定这是否也会成为问题。OP没有指定他想要哪种方法,但是您的答案仍然包含两者。哦,恭喜,您今天的声誉得分翻了一番:)
Byte Commander

@ByteCommander是的,很公平。
hobbs

10

我不建议无限重复文本,但是您可以像这样用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行,则会用完RAM ...

我虽然正在烤面包机


OP希望处理字节,而不是行。
heemayl

@heemayl当然,您的答案更好,但我(含糊地)解释了如何计算要使用多少行来获取所需的字节,因此我认为我的答案不是完全没有用的
Zanna

4
@heemayl是什么让您确定OP需要字节?该问题实质上表明OP需要一个大文件。特定大小非常模糊(2-4GB),所以我真的怀疑是否存在特定的字节数限制。
terdon's

1
@heemayl是的,但这非常非常含糊。我的理解是,OP仅需要一个大文件,而不关心确切的大小。否则,他们会给定尺寸,而不是这么大的尺寸范围。
terdon's

1
@猫ikr!<3python <3
Zanna

9

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

如果您有耐心,则可以使用很酷的Perl 6运算符,但Perl 6的运行速度要慢得多:D
cat

@cat真的吗?我根本没有碰过6,但是我假设它只是具有所有的优点和OO附加功能。知道为什么它变慢吗?
terdon's

1
我的评论主要是glib,但是今年年初我发现 Perl 6相当慢,而Python 3则比Perl 5慢得多(我没有测试)。工作重点是功能和正确性,而不是性能,但它被列为2015年的目标。而且,Perl 6对我来说足够快吗?

(另一方面,至少可以说这些功能列表令人印象深刻。)
cat

7
  • 将要重复的单词集放入文件中,例如source.txt。获取的大小(source.txt以字节为单位),例如:

     stat -c '%s' source.txt
    
  • 确定目标文件的大小,例如destination.txt2 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,所需的时间就越少。


1
难道不是destination.txt每次循环迭代都打开和关闭一次吗?
恢复莫妮卡-ζ-16年

@hexafraction Duh,已修复。
heemayl

6

您也可以使用while-loop。

示例:的内容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

4

首先执行命令:

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)

2
OP希望处理字节,而不是行。
heemayl

OP还保留了用于填充文件的应对线。我的第一个命令已经根据所需的内存字节创建了文件。
Avani badheka,2016年

@heemayl换行符仍然占用一个字节,与我之前的注释相同。这是合法角色。但是,OP确实指定了单词 Avani,所以我认为您的/ dev / urandom技术无法回答他们的问题。
Mike S

是否要尝试一些随机字节取决于/ dev / urandom。甚至您也可以选择自己的一些包含那么多字节数据的文件。
Avani badheka '16

4

FIFO可能就是您想要的。您可以通过进程替换将shell命令的结果绑定到该文件,而不用给定的文件调用程序,该程序会将其输出视为纯文本文件。这样做的好处是,您不再受磁盘空间的限制,因此您可以达到文件大小,否则,只要程序不需要先缓冲整个文件即可,并且只需逐行解析即可。例如,使用@hobbs的回复生成内容:

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

这给我借了一个95 GB的文件(根据wc),而没有占用HDD空间,几乎没有任何RAM,仅足以缓冲该命令在读取之前返回的内容。这几乎与您将要获得的“无限”接近。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.