テキストファイルの内容を空にする


16

ホームディレクトリに、cronジョブを通じて定期的にデータを受信するテキストファイルがあります。cronジョブは動的データを提供するため、ファイルの内容を空にするようにcronジョブを設定したいでしょう(ファイルはまだ存在している必要があります)。ファイルを空にするのに役立つコマンドだけで、cronのヘルプは必要ありません。


5
代替方法:tail -n +1000 file.txt > file.txt1000行を削除し、ファイル内の最新行を保持する必要があります(何かを追跡するために、最近のレコードの一部がいつ必要になるかわかりません)。
リンツウィンド

2
実際には、スケジュールされた時間にファイルをクリアするよりも優れたオプションです。
ブルーノペレイラ

1
@Rinzwind、これは動作しません。ファイルがtailが読み込もうとする前に切り捨てられるためです。新しいファイルにリダイレクトしてから、元のファイルを新しいファイルに置き換える必要があります。
-psusi

True @psusi :)そこに追加のリダイレクトが必要です。
リンツウィンド

回答:


28

最も簡単な方法:

> filename

これはあまり明白ではない方法であり、おそらく他の人がシェルスクリプトで読むことはできませんが、必要なのはそれだけです。

>は実際にはコマンドではないため(bashビルトインです)、使用できません。

sudo > filename

そのファイルに対するアクセス許可がない場合。ただし、次を使用できます。

sudo bash -c "> filename"

許可が拒否されたと言うため、どのような許可を変更する必要がありますか、私はすでにファイルにchmod 755を行っています、または新しいポストにする必要があります(許可の質問を意味します)
-sosytee

@sosytee私の新しい編集をご覧ください。
ラドゥラデアヌ

1
@sosyteeもちろんできますが、自分ではsudo crontab -eなく、rootのcronジョブを追加するために使用します。または、ファイル許可を755ではなく766(または666)に変更しますsudo chmod 766 filename。詳細:codex.wordpress.org/Changing_File_Permissions
ラドゥラディアナヌ

1
truncate filenameは、空の出力をファイルにリダイレクトするよりも少し簡潔で単純であり、で問題が発生することはありませんsudo
-psusi

1
@psusiはtruncate -s 0 filename確かにトリックを作ることができます。回答として追加できます。
ラドゥラデアヌ

19

そのために作成されたツールがあります。

truncate -s 0 filename

これにより内容は消去されますが、同じファイルのままです(iノードは同じままです)。

一部のプログラムは「inodeによる」ファイルへのハンドルを保持するため、これは重要です。ファイルを削除および再作成する単純な方法を使用して、ファイルを「空にする」と仮定します。いくつかのプログラムは、のような通常の方法で表示されなくなった場合でも、古いファイル(古いコンテンツを含む)へのハンドルを保持する場合がありlsます。

この回答の最後に、詳細へのリンクがいくつかあります。


別の方法、覚えやすいかもしれません:

echo -n > filename

これも同じiノードを保持します。

その両方に注意truncateしてecho -nによって定義されていないPOSIX

POSIX準拠の使用の場合cat /dev/null

cat /dev/null > filename

さらに別の方法、より曖昧で、おそらくシェルに依存しない:

> filename

切り捨てるファイルに書き込むためにルート権限が必要な場合、次の行はおそらく予想どおりに機能しません。

sudo echo -n > filename
sudo cat /dev/null > filename
sudo > filename

これは、sudoが実行される前でも、シェルによってリダイレクトが行われるためです。つまり、ファイルへの書き込みアクセスは、sudoによって付与される特権ではなく、シェルを実行するユーザーの特権を使用して行われます。

回避策は、次のようなsudo特権を使用して実行されるシェルへのリダイレクトを延期することです。

sudo sh -c "echo -n > filename"

truncate書き込みアクセスはシェルによって行われるのではなく、truncatesudo特権を使用してsudoによって実行されるため、使用する場合、このような回避策は必要ありません。

sudo truncate -s 0 filename

ファイルが削除された場合でも、ファイルを開いたままにするプログラムに関するいくつかの詳細については、次を読むことができます。


許可が拒否され、chmod 755ファイル名を使用したが、それでも許可が拒否された
-sosytee

2
おそらくbashでnoclobberが有効になっていますか?
レスマナ

これまでで最も完全な答え
アブデルハディ

4

これを自動化するには、logrotateを使用できます。空にするファイルの構成ファイルを作成し、他の設定を追加するだけで、毎日選択する基準に基づいて毎日自動的に空にしたり、ファイルが大きいなどの場合に空にしたりできます。

logrotateの構成方法については、http//linuxcommand.org/man_pages/logrotate8.htmlをご覧 ください。


1
私は自分でこのオプションを好みます。「ファイル> 10 Mb」->「tar.gz it to backup」「empty file」を使用します。そして、バックアップは900日後に削除されます。
リンツウィンド

3

echo "" > foo_fileこれは簡単な方法で、foo_fileのすべての内容を""で置き換え、この場合は空にします。

使用することもできます cat /dev/null > foo_filenullデバイスを読み取り、ファイルをまったく上書きせずに上書きするをます。


許可が拒否され、chmod 755ファイル名を使用したが、それでも許可が拒否されたと
言う-sosytee

通常のユーザーでファイルのアクセス許可を読んでください。
ブルーノペレイラ

はい、私は通常のユーザーとして内容を読むことができます
-sosytee
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.