UNIXで大きなファイルを作成するには?


17

私はWindowsでそのようなことをする方法を見つけました

echo "This is just a sample line appended  to create a big file. " > dummy.txt
for /L %i in (1,1,21) do type dummy.txt >> dummy.txt

http://www.windows-commandline.com/how-to-create-large-dummy-file/

UNIXでファイルをコピーし、追加してからプロセスを繰り返す方法はありますか?のようなものfor .. cat file1.txt > file1.txt


なぜ追加するのではなく、ファイルをコピーして追加するのですか?
123

@ 123 appendは良いですが、どのようにループするのですか?
トーマスリー

4
for i in {1..1000000};do echo "string" >> file;doneバッシュ。
123

9
テキストファイルである必要がありますか?/ dev / zeroまたは/ dev / urandomから任意のサイズのファイルを作成できます。
-RealSkeptic

2
私はtype file >> file無限ループで実行することを期待しています(少なくとも、バッファーに収まらないほど十分に大きい場合)。
ステファンシャゼル

回答:


29
yes "Some text" | head -n 100000 > large-file

csh/ tcsh

repeat 10000 echo some test > large-file

zsh

{repeat 10000 echo some test} > large-file

GNUシステムでは、以下も参照してください。

seq 100000 > large-file

または:

truncate -s 10T large-file

(10TiBのスパースファイルを作成します(非常に大きいが、ディスク上のスペースを取りません))および「ゼロバイトが多いテストファイルを作成する」で説明した他の選択肢。


行うcat file >> fileことは悪い考えです。

まず、cat出力ファイルと同じファイルの読み取りを拒否する一部の実装では機能しません。しかし、あなたが行うことによって、それを回避してもcat file | cat >> fileあれば、fileより大きくなってcatしまうの内部バッファ、catそれは以前に書かれたことをデータを読み込み終わると同じように無限ループで実行します。

回転式ハードドライブに支えられたファイルシステムでは、データを読み取る場所間でドライブを行き来する必要があるため、(メモリにキャッシュされる可能性のあるサイズよりも大きいサイズに達した後)かなり非効率的です。そしてそれをどこに書くか。


19
またはdd if=/dev/zero of=large-file bs=1024 count=10241MBファイルの場合
-doneal16

7
@ DougO'Neal dd if=/dev/zero of=test bs=1M count=1より明確になりました。
123


1
または、ランダムデータが必要な場合は、/ dev / zeroの代わりに/ dev / urandomを使用します。
user253751

3
@robertotomásはい、誰もがを使用していますがdd、その理由はわかりません。実際、私はこれをMBRまたは同様のフリンジタスクの読み取りにのみ使用したことがあると思います。私の経験では、他のツールは、人々が使用するほとんどの場合に、より速く、簡単で、安全ですdd。これは、一般的な!=最適な、sudo suまたはのようなケースの1つだと思いますcat file | grep foo
テルドン

22

以下を使用して、Solaris上で大きなファイルを作成できます。

mkfile 10g /path/to/file

Solaris(およびLinux)で動作する別の方法:

truncate -s 10g /path/to file

以下を使用することもできます。

dd if=/dev/zero of=/path/to/file bs=1048576 count=10240

dd 1はテラバイトに似ています
-123

1
「大きなファイル」を定義します:-)しかし、他のサンプルはすべて10gを示しているので編集
ランバート

truncate 'truncate'を実行できません。そのようなファイルまたはディレクトリTruncateは、Linux専用ではないようです。
気味悪い

truncateSolaris 11.2+に存在する
ランバート

11

Linuxシステムで大きなファイルを作成する最も速い方法はfallocate次のとおりです。

sudo fallocate -l 2G bigfile

fallocateファイルシステムを操作し、デフォルトでは実際にデータセクターに書き込みを行わないため、非常に高速です。欠点は、rootとして実行する必要があることです。

ループで連続して実行すると、数秒で最大のファイルシステムをいっぱいにすることができます。

から man fallocate

fallocateは、ファイルの割り当て解除または事前割り当てのために、ファイルに割り当てられたディスク領域を操作するために使用されます。
fallocateシステムコールをサポートするファイルシステムの場合、事前割り当ては、ブロックを割り当ててそれらを未初期化としてマークすることにより迅速に行われ、データブロックへのIOは不要です。これは、ファイルをゼロで埋めて作成するよりもはるかに高速です。
XFS(Linux 2.6.38以降)、ext4(Linux 3.0以降)、Btrfs(Linux 3.7以降)およびtmpfs(Linux 3.5以降)でサポートされます。


1
これは受け入れられた答えでなければなりません。簡単かつ迅速。
-ardochhigh

8

これは、CTRL-Cを押すまで続きます。

yes This is stuff that I want to put into my file... >> dummy.txt

ただし、1秒あたり数十万行を取得できるため、注意してください...

からman yes

yes - output a string repeatedly until killed

これは、Linux環境で大きなファイルを作成する非常に簡単な方法です。
チャミンダバンダラ

1
yes $BIG_STRING | head -c $TARGET_SIZE >> dummy.txt正確な金額を取得できます。(-n $ TARGET_NUMBER_OF_LINES)。ターゲット番号に到達したため、終了yes時に「壊れたパイプ」の結果として自動的に死にheadます。
PypeBros

4

私があなたを正しく理解していれば、あなたは次のようなものを探しています:

echo "test line" > file;
for i in {1..21}; do echo "test line" >> file; done

これにより、「テストライン」が22回繰り返されるファイルが作成されます。特定のファイルサイズが必要な場合は、このようなものを使用できます(Linuxの場合)。1024は1キロバイトです。

while [ $(stat -c "%s" file) -le 1024 ]; do echo "test line" >> file; done

個人的に、大きなファイルを作成したいときは、2つのファイルを使用し、一方をもう一方に入れます。目的のサイズ(ここでは1MB)に達するまで、プロセスを繰り返すことができます。

echo "test line" > file;
while [ $(stat -c "%s" file) -le 1048576 ]; do 
    cat file >> newfile
    cat newfile >> file
done

ファイルが制限内にある場合、すべてが再びその中に入れられるので、この解決策はしばしば望ましいサイズを超えることに注意してください。

最後に、必要なサイズのファイルだけで、実際に何かを含める必要がない場合は、次を使用しますtruncate

truncate -s 1M file

1
catファイルが実際にちょうどかかわら追加にどんな利点があるINGの?ループごとに2つのプロセスを分岐し、コンテンツ全体を複数回移動する必要があるため、時間がかかるように見えます。
123

1
@ 123の速度。このcatアプローチは、はるかに高速です。巨大なファイルを作成する場合にのみ意味がありますが、私のマシンでは10秒で545Mファイルを作成します。同じwhileループecho "test line" >> fileは、同じ時間で96Kファイルを作成しました。
テルドン

「猫」のアプローチの問題は、指数関数的に成長することだと思います。2回目の反復を開始すると、「newfile」にはすでに1行、「file」には2行、完了時には「newfile」は3行、「file」は5行になります。次に、「newfile」は8行、次へ(
21、34

欠点:ファイルの作成中に、ターゲットファイルサイズよりも多くのディスク領域(> = 1.5 * desired_size)が必要になる場合があります。
PypeBros

ところで。truncate近くにあればtruncate -s 1G、最初にファイルを作成できます。unix.stackexchange.com/a/269184/85549head -c $DESIRED_SIZEおそらくwhileループ内で、に置き換えることができます。
PypeBros

3

内容パイプすることで/dev/urandomheadあなたのように、出力をファイルにリダイレクトすることができます:

 cat /dev/urandom | head --bytes=100 >> foo.bar

100バイトのゴミを含むファイルを提供します。


1
echo "This is just a sample line appended  to create a big file. " > dummy.txt
i=1
while [ $i -le 21 ]
do
  cat dummy.txt >> bigfile
  cat bigfile > dummy.txt
  (( i++ ))
done

Windowsスクリプトと同じ効果がありますが、bashでは、ファイルをそれ自体に直接連結することはできません。


.txt拡張子を忘れる以外に、最後に2つの大きなファイルを残しています。
ott--
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.