ファイルからすべてのエントリを削除する3つの方法を知っています。
彼らです
>filename
touch filename
filename < /dev/null
これら3つのうち>filename
、キーストロークの回数が最も少ないので、私は最も悪用しています。
ただし、大きなログファイルと小さなファイルに関して、3つのうちのどれが最も効率的か(より効率的な方法がある場合)を知りたいと思います。
また、3つのコードはどのように動作し、コンテンツを削除しますか?
ファイルからすべてのエントリを削除する3つの方法を知っています。
彼らです
>filename
touch filename
filename < /dev/null
これら3つのうち>filename
、キーストロークの回数が最も少ないので、私は最も悪用しています。
ただし、大きなログファイルと小さなファイルに関して、3つのうちのどれが最も効率的か(より効率的な方法がある場合)を知りたいと思います。
また、3つのコードはどのように動作し、コンテンツを削除しますか?
回答:
実際、2番目のフォームtouch filename
はファイルから何も削除しません。空のファイルが存在しない場合にのみ作成するか、既存のファイルの最終変更日を更新します。
3番目filename < /dev/null
は/dev/null
、入力としてfilenameを実行しようとします。
cp /dev/null filename
動作します。
効率的には、最も効率的なのはtruncate -s 0 filename
; ここを参照してください:http://linux.die.net/man/1/truncateを。
それ以外の場合、cp /dev/null filename
または> filename
両方とも問題ありません。それらは、truncate-on-open設定を使用して、ファイルを開いてから閉じます。 cp
また、を開く/dev/null
ため、わずかに遅くなります。
一方、truncateコマンドを実行するには、システムが実行可能ファイルを開き、ロードして実行する必要があるため、スクリプトから実行する場合truncate
よりも遅くなる可能性があります> filename
。
truncate
が最も効率的だと言うのですか?
> filename
メソッドが呼び出す必要があるclose()システムコールも回避します。
truncate(2)
はしません。
touch filename
、inodeは同じままになります(以前にファイルがあった場合)。
ls -i
他のオプションは次のとおりです。
echo -n > filename
のmanページからecho
:
-n Do not print the trailing newline character.
sh、csh、bashなどで使用可能な組み込みコマンド「:」があり、リダイレクト出力演算子で簡単に使用して>
ファイルを切り捨てることができます。
#!/usr/bin/env bash
:> filename
これに関して私が気に入っているのは、「echo」などの外部コマンドを必要としないことです。
ファイルを削除/再作成する代わりに切り捨てることの大きな利点の1つは、このファイルで動作するアプリケーション(誰かがtail -f filename
監視ソフトウェアを作成するなど)を再度開く必要がないことです。彼らはファイル記述子を使い続けることができ、すべての新しいデータを取得します。
man bash
:
シェルビルトインは効果がないと説明しています。
>
inでファイルにリダイレクトすると、ファイルが存在しない場合はファイルが作成され、存在する場合はゼロに切り捨てられます。ベター:を使用:
して何もせず、>
ファイルに何もリダイレクトせずに切り捨てます。
> file
ファイルを切り捨てるには十分です。コマンドは不要で、リダイレクト演算子のみが必要です。
> filename
動作しません。たとえば、zshで。しかし、: > filename
まだ動作します。
> myfile
が、たとえば、次のようなcshエラー:nullコマンドが無効です。
truncate -s 0 filename
?