Linuxで指定されたサイズのファイルを作成する方法は?


回答:


187
dd if=/dev/zero of=upload_test bs=file_size count=1

どこをfile_sizeバイト単位でテストファイルのサイズです


ああ、1つのブロックですべてを行うため、私のアプローチよりも効率的かもしれません。良いアイデア。
ポールトンブリン

10
実際、巨大なブロックサイズを使用すると、書き込み前にその量をメモリに割り当てて読み取るため、非常に大きくなるとパフォーマンスが大幅に低下します。これがbs = 4GiBのようなものであれば、おそらくスワッピングになるでしょう。
ブライアン、

35
ddの値には2 ^ 32の制限があるため、4 GBより大きいファイルを作成するには、トリックがありますdd if=/dev/zero of=test bs=1M count=<size in megabytes>
Dmytro Sirenko 2013年

2
より適切で迅速なアプローチについては、次の回答を参照してください
エレガントなサイコロ

2
@elegantdice次の答えは明確ではありません。彼らは自分の立場を変えることができます
vladkras

160

モダンの方が簡単で高速です。Linuxの場合(1つ選択)

truncate -s 10G foo
fallocate -l 5G bar

それは必要であると述べていることがtruncateスパースファイルをサポートするファイルシステム上のスパースファイルを作成しますfallocateしません。スパースファイルは、ファイルを構成するアロケーションユニットが、使用されるまで実際には割り当てられないファイルです。ファイルのメタデータにはなりますが、いくつかのかなりのスペースを取るませんが、おそらく何のどこのファイルの実際のサイズに近いです。このタイプのファイルには長所と短所があるため、詳細についてはスパースファイルに関するリソースを参照してください。非スパースファイルには、事前にブロック(アロケーションユニット)が割り当てられています。つまり、ファイルシステムが認識している限り、スペースが予約されます。また、fallocatetruncate指定された値にファイルの内容を設定しませんように dd代わりに、割り当てられたファイルの内容、fallocateまたはtruncate作成時に割り当てられたユニットに存在していたごみの値である可能性があり、この動作は望ましくない場合があります。ddそれのコマンドラインオプションで指定されたとして、それは実際にはファイル全体ストリームへのデータの値またはチャンクを書き込むため、最も遅いです。

この動作は、使用されるファイルシステムとそのファイルシステムの標準または仕様への準拠に応じて、異なる可能性があります。したがって、適切な方法を使用しているかどうかを確認するために適切な調査を行うことをお勧めします。


試しましたtruncate。上記の構文を使用して、サイズがゼロのファイルを生成しました。の「manページ」fallocateは、作成するファイルspaceがデータではなく空でいっぱいであることを示しています。「1Gファイルをコピーするのにどのくらい時間がかかるか」など、予想されるいくつかのケースでは役に立たないようです。
Mark Stosberg、2012年

6
fallocateは私にとってはうまくいくようです。適切なサイズのファイルを作成します。
Aater Suleman

5
これがこの質問に対する最良の答えです。truncate / fallocateは、ファイルのすべてのブロックを書き込むわけではないため、時間がかかりません。ただし、結果のファイルをどこかにアップロードすると、全体のゼロが読み取られます。
マイクアンドリュース2014年

4
これをOSXで実行する場合は、次のようにする必要がありますbrew install coreutils。これにより、コマンドの前にgが追加されるため、次のように実行する必要がありますgtruncate -s 10G foo。お役に立てれば!
DerekE、2015

NTFSパーティションでは動かないようです。
eloyesp 2017年

40

Tomの投稿をフォローアップするためだけに、ddを使用してスパースファイルを作成することもできます。

dd if=/dev/zero of=the_file bs=1 count=0 seek=12345

これにより、ほとんどのUNIXで「穴」のあるファイルが作成されます。データは実際にはディスクに書き込まれず、ゼロ以外のものが書き込まれるまで領域を占有しません。


count = 0に設定すると、ファイルサイズから1バイトを減算する必要がなくなります。
andrewdotn 2008

3
count=0bs * seekファイルサイズになります
Jayen

24

OSX(およびSolarisの場合)では、mkfile次のコマンドも使用できます。

mkfile 10g big_file

これにより、「big_file」という名前の10 GBファイルが作成されます。ここでこのアプローチを見つけました。


これは、OS Xなどのtruncateand fallocateコマンドが使用できない状況で役立ちます。メガバイト用ではなく、dd上記のように動作します。mM
user535673 2015年

誤り:これにより10 GiBファイル(=〜10.7 GB)が作成されます。
デザート

20

次のコマンドを使用します。

dd if = $ INPUT-FILE of = $ OUTPUT-FILE bs = $ BLOCK-SIZE count = $ NUM-BLOCKS

大きな(空の)ファイルを作成するには、を設定し$INPUT-FILE=/dev/zeroます。
ファイルの合計サイズはになります$BLOCK-SIZE * $NUM-BLOCKS
作成される新しいファイルはになります$OUTPUT-FILE


なぜ質問したのですか?
ヘンリーB

9
私は答えをグーグルで調べなければならなかったので、ここに置いたので、議論して最新の状態に保つことができます...サイト全体の要点を知っていますか?
Grundlefleck 2008

2
私は人々が@GrundlefleckをXP whoringに投票することを知っていますが、彼はポイントを持っています-ジェフとジョエルによって想定されたこのサイトを使用する方法の1つは、あなたが発見したものに質問と回答をすることです。
ポールトンブリン

3
ポールに感謝します。ポイントについてはそれほど気にしていませんが、Googleで見つけたものについて、ここで尋ねない限りわからないような何らかの欠陥があるかもしれません。私がむしゃむしゃ、肩をすくめていると思ったら、人々は私のQ / Aコミュニティを自由に所有させてください。
Grundlefleck 2008

2
よくある質問から引用すると、「プログラミングの質問に答えるのもまったく問題ありませんが、Jeopardyにいるふりをして、質問の形式でそれを表現してください。」
クレイグアンガス

17

プログラムでそれを行うことができます:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>

int main() {
    int fd = creat("/tmp/foo.txt", 0644);
    ftruncate(fd, SIZE_IN_BYTES);
    close(fd);
    return 0;
}

このアプローチは、後でファイルをメモリにmmapするのに特に役立ちます。

次のコマンドを使用して、ファイルのサイズが正しいことを確認します。

# du -B1 --apparent-size /tmp/foo.txt

注意してください:

# du /tmp/foo.txt

ファイルシステムでサポートされている場合、スパースファイルとして割り当てられるため、おそらく0を出力します。

参照:man 2 openおよびman 2 truncate


10

あなたができる:

[dsm@localhost:~]$ perl -e 'print "\0" x 100' > filename.ext

ここで、100を書き込むバイト数に置き換えます。


そして実際の充填バイトも。「\ xff」が必要で、問題なく動作します。ありがとう!:)
Ray

10

これらの回答のいくつかは/dev/zero、データのソースとして使用しています。テストネットワークのアップロード速度が速い場合、アプリケーションが圧縮を行っている場合、これは最良のアイデアではない可能性あります。ゼロでいっぱいのファイルは非常によく圧縮されます。このコマンドを使用してファイルを生成する

 dd if=/dev/zero of=upload_test bs=10000 count=1

upload_test約200バイトまで圧縮できました。したがって、10KBのファイルをアップロードすると思われる状況に陥る可能性がありますが、実際にはそれよりはるかに少なくなります。

/dev/urandom代わりにを使用することをお勧めし/dev/zeroます。/dev/urandomあまり出力を圧縮できませんでした。


私の組み込みシステムではありません/dev/zeroので、/dev/urandom良いです。
Fredrick Gauss、

9
dd if=/dev/zero of=my_file.txt count=12345

4
ddのデフォルトのブロックサイズは512バイトであるため、このコマンドはファイルのサイズを12345 * 512バイトにすることに注意してください。

4

答えはたくさんありますが、他に何ができるかをうまく説明したものはありません。ddのマニュアルページを見ると、ファイルのサイズをより適切に指定することができます。

これにより、20メガバイトのサイズを持つ、ゼロで満たされた/tmp/zero_big_data_file.binが作成されます。

    dd if=/dev/zero of=/tmp/zero_big_data_file.bin  bs=1M count=20

これにより、サイズが1000バイトのゼロで満たされた/tmp/zero_1000bytes_data_file.binが作成されます。

    dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1kB count=1

または

    dd if=/dev/zero of=/tmp/zero_1000bytes_data_file.bin  bs=1000 count=1

  • すべての例で、bsはブロックサイズ、countはブロック数です。
  • BLOCKSおよびBYTESの後には、次の乗法接尾辞が続く場合があります:c = 1、w = 2、b = 512、kB = 1000、K = 1024、MB = 1000 * 1000、M = 1024 * 1024、xM = M GB = 1000 * 1000 * 1000、G = 1024 * 1024 * 1024など、T、P、E、Z、Yの場合。


3

これにより、現在のディレクトリにランダムな文字を含む4 MBのテキストファイルとその名前「4mb.txt」が生成されます。パラメーターを変更して、さまざまなサイズと名前を生成できます。

base64 /dev/urandom | head -c 4000000 > 4mb.txt

0

fallocateディスクを待ちたくない場合に使用します。

例:

fallocate -l 100G BigFile

使用法:

Usage:
 fallocate [options] <filename>

Preallocate space to, or deallocate space from a file.

Options:
 -c, --collapse-range remove a range from the file
 -d, --dig-holes      detect zeroes and replace with holes
 -i, --insert-range   insert a hole at range, shifting existing data
 -l, --length <num>   length for range operations, in bytes
 -n, --keep-size      maintain the apparent size of the file
 -o, --offset <num>   offset for range operations, in bytes
 -p, --punch-hole     replace a range with a hole (implies -n)
 -z, --zero-range     zero and ensure allocation of a range
 -x, --posix          use posix_fallocate(3) instead of fallocate(2)
 -v, --verbose        verbose mode

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