ファイルからすべてのエントリを削除する3つの方法を知っています。
彼らです
>filename
touch filename
filename < /dev/null
これらの3つのうち、最も少ない数のキーストロークを必要とするため、私は>filename
を最も乱用します。
ただし、大きなログファイルと小さなファイルに関して、3つのうち最も効率的な方法(より効率的な方法がある場合)を知りたいです。
また、3つのコードはどのように動作し、コンテンツを削除しますか?
実際、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コマンドを実行すると、システムが実行可能ファイルを開いてロードし、実行する必要があるためです。
その他のオプションは次のとおりです。
echo -n > filename
echo
のmanページから:
-n Do not print the trailing newline character.
組み込みコマンド「:」があり、これはsh、csh、bashなどで使用でき、リダイレクト出力演算子>
で簡単に使用でき、ファイルを切り捨てます。
#!/usr/bin/env bash
:> filename
私がこれで好きなのは、「エコー」などのような外部コマンドを必要としないことです。
ファイルを委任/再作成するのではなく切り捨てることの大きな利点の1つは、このファイルで動作する実行中のアプリケーション(たとえば、誰かがtail -f filename
または監視ソフトウェアを作成するなど)がファイルを再び開く必要がないことです。彼らはファイル記述子を使い続けることができ、すべての新しいデータを取得します。