web-dev-qa-db-ja.com

ファイルの内容を空にする

ファイルからすべてのエントリを削除する3つの方法を知っています。

彼らです

  • >filename
  • touch filename
  • filename < /dev/null

これらの3つのうち、最も少ない数のキーストロークを必要とするため、私は>filenameを最も乱用します。

ただし、大きなログファイルと小さなファイルに関して、3つのうち最も効率的な方法(より効率的な方法がある場合)を知りたいです。

また、3つのコードはどのように動作し、コンテンツを削除しますか?

230
debal

実際、2番目の形式touch filenameはファイルから何も削除しません。空のファイルが存在しない場合にのみ作成するか、既存のファイルの最終更新日を更新します。

そして、3番目のfilename < /dev/nullは、/dev/nullを入力として使用してファイル名を実行しようとします。

cp /dev/null filenameは機能します。

効率的には、truncate -s 0 filenameが最も効率的です。ここを参照してください: http://linux.die.net/man/1/truncate

それ以外の場合は、cp /dev/null filenameまたは> filenameのどちらでも問題ありません。どちらも、ファイルを開いてから閉じ、「開くときに切り捨て」の設定を使用します。 cp/dev/nullを開くため、わずかに遅くなります。

一方、スクリプトから実行すると、truncate> filenameよりも遅くなる可能性があります。これは、truncateコマンドを実行すると、システムが実行可能ファイルを開いてロードし、実行する必要があるためです。

305
ash

その他のオプションは次のとおりです。

echo -n > filename

echoのmanページから:

-n Do not print the trailing newline character.

45
Arturo Herrero

組み込みコマンド「:」があり、これはsh、csh、bashなどで使用でき、リダイレクト出力演算子>で簡単に使用でき、ファイルを切り捨てます。

#!/usr/bin/env bash
:> filename

私がこれで好きなのは、「エコー」などのような外部コマンドを必要としないことです。

ファイルを委任/再作成するのではなく切り捨てることの大きな利点の1つは、このファイルで動作する実行中のアプリケーション(たとえば、誰かがtail -f filenameまたは監視ソフトウェアを作成するなど)がファイルを再び開く必要がないことです。彼らはファイル記述子を使い続けることができ、すべての新しいデータを取得します。

5
Mirko Steiner