大きなファイルを切り捨てるためのUnixシェルスクリプト


87

たとえば3GBのスペースに達すると、アプリケーションによって継続的に書き込まれ/開かれているファイルを切り捨てる/空にするUnixスクリプトを作成しようとしています。私は以下のコマンドがそれを行うことを知っています:

cp /dev/null [filename]

しかし、これを本番環境でcronジョブとして自動的に実行します。ここに投稿して、これと同様のことをしているときに問題が発生したかどうかを確認してください。


これらは製品です。ログには価値がありませんか?幸運なことに、本番ログを1年以上(bzip2 -9 fmtで)保持し、ジョブランタイム、処理されたレコードを簡単に抽出できる小さなユーティリティがいくつかあり、スプレッドシートにロードすると、計算とグラフのロード率が簡単になりました。とたくさんのもの。負荷率が低下しているため、hdwrの問題が見つかりました。はい、そこには素敵な監視ツールがあるので、それはすべてあなたの状況に依存します。別のオプションとして、あなたは見たlogrotateことがありますか、それはあなたにいくつかの価値を提供するかもしれません(しかしそれを設定するのは面倒です(推測するだけです)!)。
シェルター2012年

5
ログファイルがO_APPENDフラグで開かれている場合、切り捨てが有効であることに注意してください。O_APPENDフラグで開かれていない場合、プログラムはオフセット3 GiBで書き込みを続行します(初回)。システムは最初の3GiBをall-bytes-zero(十分に圧縮されます)として扱いますが、ファイルは増え続けます。それはすべて、ログを書き込むプログラムに依存します。
ジョナサンレフラー2012

回答:


116

別の答えを追加するだけで、

: > filename

: はbashのno-op(POSIX準拠)であるため、これは基本的に、書き込み用にファイルを開き(もちろんファイルを切り捨てます)、すぐに閉じます。

編集:シェルターがコメントしたように、リダイレクトを実行するためのコマンドは実際には必要ありません:

$ echo foo > foo.txt
$ cat foo.txt
foo
$ > foo.txt
$ cat foo.txt
$

単純なリダイレクトだけでファイルがクリアされます。


25
またはちょうど> filename(あなたが知っていると確信しているように)。皆さんお元気で。
シェルター2012年

5
@shelter "$> file"はPOSIXではなく、移植性もありません。最初に提案されたように、リダイレクトする前に「:」no-opコマンドを使用する必要があります。
Aaron Toponce 2013

2
+プラススマイリーフェイスのために
クリスSuszyński

2
@AaronToponceが指摘したように、「$> file」は確かに移植性がありません。私のZshセットアップでは、シェルがハングします(おそらく入力を待っています)。「$:>ファイル」はZshで問題なく動作します。
Linus Arver 2016

1
@TechEnthusiastそれはあなたの期待に依存します。切り捨て自体はアトミックですが、特定の書き込みに関連していつ発生するかは実際にはわかりません。たとえば、ファイルの先頭に部分的な行が表示される可能性があります。
chepner 2018

65

私はdebianで次のコマンドを使用しました

truncate -s 0 filename

@SteveClay:sudo sh -c ': > filename'切り捨ても行われますfilename
Perleone 2016年

2
@SteveClay OPの提案は、次の場合にも問題なく機能しsudoますsudo cp /dev/null filename。また、最新のLinuxのみであるのcpに対し、移植性もtruncateあります。
ティノ

11

それは私には理にかなっているようです。もちろん、Unixではこれを約50の異なる方法で行うことができます。例えば、

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.