単語のセットを無限に繰り返すターミナルからファイルを作成する方法は?


19

単語のセットを無限に繰り返すターミナルからファイルを作成する方法は?サイズが2〜4 GBのような解析目的で巨大なファイルを作成するために必要です。現在、同じファイルに貼り付け行を手動でコピーして、サイズを大きくしています。


1
私は特別なunixファイルで動作する答えを見たいので、実際にはそのスペースを占有しないでしょう。それは可能ですか?
デリソンジュニオ

1
本当に無限の何かを意味しmkfifo huge.tmp; while true; do yes "a dummy line" > huge.tmp; doneますか?
ボルデウィン

回答:


50

行を何度も繰り返す簡単な方法があります。

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

2
OPは行ではなくバイトを扱いたい。
heemayl

4
バイト単位で制限を指定するhead -c 10000にはhead -n 10000、10k行ではなく10 kBで使用します。
バイトコマンダー

@ByteCommanderはい、ただし、行の途中で出力が途切れるのを防ぐことはできません。サイズは正確である必要はないので、適切なサイズを得るために行数を
計算し

1
私は同意しますが、それが問題になるかどうかもわかりません。OPはどの方法を希望するかを指定しませんでしたが、回答にはまだ両方が含まれています。ああ、そして今日あなたの評判スコアを2倍にしたことをおめでとう:)
バイト司令官

@ByteCommanderうん、フェア。
ホッブズ

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の場合、各文字は1バイトなので、書きたいものに応じて適切に計算します...

CPUを所有している可能性があります。10,000,000行を超える行を実行しようとすると、RAMが不足します...

私はトースターを実行しています


OPは行ではなくバイトを扱いたい。
-heemayl

@heemaylはもちろん、あなたの答えは良いですが、私は(漠然と)私は私の答えは全く役に立たないと思いますので、必要なバイト数を取得するために使用する行数を計算する方法を説明しました
Zanna

4
@heemayl OPがバイトを望んでいるのはなぜですか?質問は基本的にOPが大きなファイルを望んでいると述べています。特定のサイズは非常に曖昧(2〜4GB)であるため、特定のバイト制限があることを本当に疑っています。
テルドン

1
@heemaylはい、しかしそれは非常に曖昧です。私の理解では、OPは単に大きなファイルを必要とし、正確なサイズは気にしないということです。そうでなければ、彼らはそのような巨大な範囲のサイズの代わりにサイズを与えたでしょう。
テルドン

1
@cat 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には触れませんでしたが、それはすべての本質的な長所に加えてオブジェクト指向エクストラを持っていると仮定していました。なぜそれが遅いのか考えていますか?
テルドン

1
私のコメントのほとんどはglibでしたが、今年の初めに、Perl 6は非常に遅いことがわかりました。作業は、パフォーマンスではなく機能と正確さに焦点を当てていますが、2015年の目標としてリストされました。また、Perl 6は十分に高速ですか?

(一方で、機能のリストは控えめに言っても印象的です。)

7
  • 繰り返される単語のセットをファイルに入れます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必要な時間は短くなります。


1
これdestination.txtは、ループの反復ごとに一度開いたり閉じたりしませんか?
モニカを復活させる-ζ--

@hexafraction Duh、修正済み。
-heemayl

6

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

4

最初にコマンドを実行します:

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)

2
OPは行ではなくバイトを扱いたい。
-heemayl

OPはファイルを埋めるための行を維持します。そして、私の最初のコマンドは、必要なメモリのバイトごとにファイルをすでに作成しました。
アヴァニバデカ16

@heemaylは、以前のコメントと同じように、改行文字がまだ1バイトを占めています。それは正当なキャラクターです。ただし、OPは単語 Avaniを指定しているため、/ dev / urandomテクニックが彼らの質問に答えるとは思いません。
マイクS

ランダムバイトを試しているかどうかは、/ dev / urandomに依存します。そのバイト数のデータを含む独自のファイルを選択することもできます。
アヴァニバデカ16

4

FIFOはおそらくあなたが探しているものです。特定のファイルを使用してプログラムを呼び出す代わりに、プロセス置換を介してシェルコマンドの結果をそれに関連付けることができ、プログラムはその出力をプレーンテキストファイルとして表示します。ここでの利点は、ディスクスペースによって制限されなくなることです。そのため、プログラムが最初にファイル全体をバッファリングする必要がなく、行ごとに解析できる限り、そうでなければ不可能なファイルサイズに到達できます。たとえば、@ hobbsの返信を使用してコンテンツを生成します。

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

これにより、95 GBのファイル(wcによる)が、HDDスペースとほとんどRAMなしで、コマンドが読み取られる前にコマンドが返すものをバッファリングするのに十分な大きさになります。これは、取得しようとする「無限に」ほぼ同じです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.