ファイルの内容を空にします


220

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

彼らです

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

これら3つのうち>filename、キーストロークの回数が最も少ないので、私は最も悪用しています。

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

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


24
どうtruncate -s 0 filename
マーティントーマ14年


最初は、bashのコマンドラインから呼び出された場合にのみ動作しますが、.SHファイルに実行された場合は動作しません
マルコマルサラ

8
touchはコンテンツを削除しませんが、ファイルのアクセス時間を変更します。それはない作成何も存在しない場合は、空のファイルを。
hbogert

回答:


293

実際、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


9
なぜそれtruncateが最も効率的だと言うのですか?
ステファンシャゼル

7
truncate操作は、ファイルを開くことに煩わされないftruncate()またはtruncate()システムコールを使用します。また、cpおよび> filenameメソッドが呼び出す必要があるclose()システムコールも回避します。

3
実際には、(少なくともGNUのものは)open + ftruncate + closeを実行します(それ自体をロードして初期化するために行う多くのシステム呼び出しに加えて)。とにかく、存在しない場合はファイルを作成する必要がありますそれtruncate(2)はしません。
ステファンシャゼル

を使用した場合touch filename、inodeは同じままになります(以前にファイルがあった場合)。
pMan

1
はい@pMan、あなたはそれを試してみて、と確認することができますls -i
terdon

43

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

echo -n > filename

のmanページからecho

-n Do not print the trailing newline character.


サイズを設定するにはどうすればよいですか?30000個のヌル文字が必要な場合はどうしますか?
ユーザー

3

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

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

これに関して私が気に入っているのは、「echo」などの外部コマンドを必要としないことです。

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


man bash:シェルビルトインは効果がないと説明しています。
ハキシエル

はい、これを>inでファイルにリダイレクトすると、ファイルが存在しない場合はファイルが作成され、存在する場合はゼロに切り捨てられます。ベター:を使用:して何もせず、>ファイルに何もリダイレクトせずに切り捨てます。
ミルコシュタイナー

1
どうしてそうするか?> fileファイルを切り捨てるには十分です。コマンドは不要で、リダイレクト演算子のみが必要です。
テルドン

1
時々、 > filename動作しません。たとえば、zshで。しかし、: > filenameまだ動作します。
CSペイ

Bashとshは好きに思えます> myfileが、たとえば、次のようなcshエラー:nullコマンドが無効です。
ミルコシュタイナー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.