回答:
行を何度も繰り返す簡単な方法があります。
yes we have no bananas | head -n 10000 > out.txt
「バナナはありません」と言っている10,000行を含むout.txtになります。
出力を正確なバイト数に制限するには、ではなくheadの-cオプションを使用します-n。たとえば、これは正確に10 kBのテキストを生成します。
yes we have no bananas | head -c 10000 > out.txt
head -c 10000にはhead -n 10000、10k行ではなく10 kBで使用します。
テキストを無限に繰り返すことはお勧めできませんが、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の場合、各文字は1バイトなので、書きたいものに応じて適切に計算します...
CPUを所有している可能性があります。10,000,000行を超える行を実行しようとすると、RAMが不足します...
私はトースターを実行しています
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
繰り返される単語のセットをファイルに入れます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必要な時間は短くなります。
destination.txtは、ループの反復ごとに一度開いたり閉じたりしませんか?
while-loopを使用することもできます。
例:内容foo.txt(これはあなたのソースです):
foo
bar
foobar
bar.txt空です(これがターゲットファイルです)。次のループをrnして、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をファイルにリダイレクトするため、2行を入力してからCtrl + Dを押す必要があります。次に、次のコマンドを実行する必要があります。
for i in {1..n}; do cat file.txt file.txt > file2.txt && mv file2.txt file.txt; done
nは整数です。これにより、元の2行を複製して、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はおそらくあなたが探しているものです。特定のファイルを使用してプログラムを呼び出す代わりに、プロセス置換を介してシェルコマンドの結果をそれに関連付けることができ、プログラムはその出力をプレーンテキストファイルとして表示します。ここでの利点は、ディスクスペースによって制限されなくなることです。そのため、プログラムが最初にファイル全体をバッファリングする必要がなく、行ごとに解析できる限り、そうでなければ不可能なファイルサイズに到達できます。たとえば、@ hobbsの返信を使用してコンテンツを生成します。
wc -c <(yes we have no bananas | head -n 5000000000)
これにより、95 GBのファイル(wcによる)が、HDDスペースとほとんどRAMなしで、コマンドが読み取られる前にコマンドが返すものをバッファリングするのに十分な大きさになります。これは、取得しようとする「無限に」ほぼ同じです。