ファイルからすべてのエントリを削除する3つの方法を知っています。
彼らです
>filenametouch filenamefilename < /dev/null
これら3つのうち>filename、キーストロークの回数が最も少ないので、私は最も悪用しています。
ただし、大きなログファイルと小さなファイルに関して、3つのうちのどれが最も効率的か(より効率的な方法がある場合)を知りたいと思います。
また、3つのコードはどのように動作し、コンテンツを削除しますか?
ファイルからすべてのエントリを削除する3つの方法を知っています。
彼らです
>filenametouch filenamefilename < /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?