web-dev-qa-db-ja.com

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

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

20
Thomas Lee
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 >> filefilecatの内部バッファより大きい場合、以前に書き込んだデータを読み取ってしまうため、catが無限ループで実行されます。 。

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

31

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
22
Lambert

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

Sudo fallocate -l 2G bigfile

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

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

man fallocateから

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

11
Rui F Ribeiro

これはCTRL-Cになるまで続きます:

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

ただし、数十万行/秒になる可能性があるので注意してください...

man yes

yes - output a string repeatedly until killed
8
Questionmark

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

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つのファイルを使用し、一方を他方に猫します。目的のサイズ(ここでは1 MB)に達するまで、このプロセスを繰り返すことができます。

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

ファイルが制限を下回っている場合、すべてが再びその中に含まれるため、このソリューションは多くの場合、望ましいサイズを超えます。

最後に、必要なのが目的のサイズのファイルであり、実際に何かを含める必要がない場合は、truncateを使用できます。

truncate -s 1M file
4
terdon

/dev/urandomの内容をheadにパイプすることで、出力をファイルにリダイレクトできるため、次のようになります。

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

100バイトのゴミが含まれるファイルを取得します。

3
spender
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では、ファイルをそれ自体に直接連結することはできません。

1
MelBurslan