web-dev-qa-db-ja.com

コマンドラインから特定のサイズのファイルを作成する方法を教えてください。

特定のサイズ(例:14 MB)でファイルを作成するにはどうすればよいですか(例:touchコマンドまたは他の類似の方法を使用)。

ユースケースは、さまざまなファイルサイズでFTPをテストすることです。特定のサイズのファイルを作成できる場合は、FTP転送などを確認すると便利です。

124
fasil

truncate を使用してください。

truncate -s 14M filename

man truncateから:

DESCRIPTION
   Shrink or extend the size of each FILE to the specified size

[...]

 -s, --size=SIZE
          set or adjust the file size by SIZE

注意:truncateはあなたのシステムでは利用できないかもしれません。 Mac OS Xでは、デフォルトではインストールされません(ただし、たとえばmacportsを使って簡単にインストールできます)。このような場合は、代わりにddまたはheadを使用する必要があります。

157

編集:最も簡単な方法はおそらくAshutosh Vishwa Bandhuの 答えtruncateですが、 @ offby1 によって指摘されるように sparseを作成します。あなたが望むものではないかもしれないファイル 。以下の解決策は通常のフルファイルを作成します。


次のコマンドは、fooという名前の14MBファイルを作成します。

  1. fallocate(コメントで提案し、Ahmed Masudの 回答 に投票してくれた @ Breakthrough に感謝)

    fallocate -l 14000000 foo
    

    このコマンドは、ファイルサイズに関係なくtruncate(瞬時)と同じくらい速く(大きなファイルでは遅くなる他のソリューションとは異なり)、スパースファイルではなく通常ファイルを作成するので、特に印象的です。

    $ truncate -s 14MB foo1.txt 
    $ fallocate -l 14000000 foo2.txt 
    $ ls -ls foo?.txt 
        0 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:54 foo1.txt
    13672 -rw-r--r-- 1 terdon terdon 14000000 Jun 21 03:55 foo2.txt
    
  2. ランダムデータでいっぱいになったファイルを作成する

    dd if=/dev/urandom of=foo bs=14MB count=1
    

    または

    head -c 14MB /dev/urandom > foo
    
  3. \0sで埋められたファイルを作成します。

    dd if=/dev/zero of=foo.txt bs=14MB count=1
    

    または

    head -c 14MB /dev/zero > foo
    
  4. 別のファイルの最初の14MBのデータで埋められたファイルを作成します。

    head -c 14MB bar.txt > foo
    
  5. 別のファイルの最後の14MBのデータでいっぱいになったファイルを作成します。

    tail -c 14MB bar.txt > foo
    

上記のすべての例で、14*1000*1000が必要な場合、ファイルは14*1024*1024になります。MBMに置き換えます。例えば:

dd if=/dev/urandom of=foo bs=14M count=1
head -c 14M /dev/zero > foo

fallocateはバイトでしか扱えないので、あなたはしなければならないでしょう(14 * 1024 * 1024 = 14680064)

fallocate -l 14680064 foo
99
terdon
dd bs=1MB count=14 if=/dev/zero of=<yourfilename>

WARNINGddは黙って何かを上書きしますあなたがそれを指定するなら、あなたは書く権利を持っています喜んでまたは偶然に。 ddを理解していることを確認してください。 dd --helpを読むことで、そしてあなたはあなたのddコマンドラインを台無しにしないか、さもなければあなたは簡単に不可逆的なデータ損失を起こすことができます - さらには

はじめに、if=入力ファイルof=出力ファイルです。 コマンドを実行する前に、正しいことを必ず再確認してください。 :)

21
n611x007

マジックを使うdd;) マニュアルページ

$ dd if=/dev/zero of=output.dat  bs=1024  count=14336

14MB * 1024 = 14336KB、または

$ dd if=/dev/zero of=output.dat  bs=1MB  count=14

そして、0で埋められた14mbのoutput.datファイルを入手するでしょう。D

13
mirkobrankovic

これが最速の方法です。

SEEK=$SIZE-1
dd if=/dev/zero of=outfile bs=1 seek=$SEEK count=1 

さもなければちょうど正確な位置へのシークをしてシングルバイトを書く迅速で汚いCまたはPerlプログラムを書く。これは、実際にブロックにデータをダンプするよりも速いLOTです。

疎なファイルを避けたい場合は、Linux(そしておそらく他のシステム)ではfallocate -l <length>からutil-linuxを使用できます。

それが利用できない、そしてあなたがPOSIX準拠のシステムを持っているなら、あなたはposix_fallocate()ライブラリ呼び出しを使って速くて汚いプログラムを書くことができます。 posix_fallocateは指定された範囲の割り当てを保証するので、それが正常に戻った場合に範囲のその後の使用時にディスクがいっぱいになることはありません。

8
Ahmed Masud

ddはそのための移植性の高い方法ですが、コマンド mkfile および xfs_mkfile は、特にこの目的のために書かれています。速いです:

mkfile size[b|k|m|g] filename
xfs_mkfile size[b|k|m|g] filename

キャッチはどちらのコマンドも普遍的に利用可能ではないので、それらは移植可能なスクリプトを書くのには良くありません。しかし、コマンドラインから対話的に実行しているのであれば、それらが私が使用しているコマンドです。

デフォルトでは、それらはゼロで埋められたファイルを作成し、 sparse(または "holey")ファイルではありません 。どちらも-nオプションを使ってスパースファイルを作成します。

6
Old Pro

Perlには別の選択肢があります。

Perl -e 'print "a" x 1024' > file.txt

1KBのファイルが作成されます。 1024を好きな番号に置き換えます。

1
Majid Azimi