30日以上経過したファイルを適切に削除する


8

最小で15000ファイルのキャッシュフォルダがあります。

私はこれを試しました:

find cache* -mtime +30 -exec rm {} \;

しかし、これは私のサーバー負荷を空に飛ばしました!

より速く/より良い解決策はありますか?

または、このコマンドの速度または反復制限できますか?


1
cache*が多くのファイルに展開される場合は、find . -name 'cache*' -mtime +30 -exec rm {} \;代わりに次のようなものを試してください。
Jaap Eldering

回答:


10

tmpwatchはこれらのものに使用するのが好きです。これは、ファイルが最後に変更されたときのためのものです。それはシンプルで、多くの場合にうまく機能します:

tmpwatch -m 720 /path/to/cache

Ubuntuの場合は、tmpreaper代わりに確認してください。

ファイルが最後にアクセスされた時刻を確認したい場合は、以下を使用します。

tmpwatch -a 720 /path/to/cache

noatimeでマウントされたファイルシステムでtmpwatch -aを使用することはできません。引き続き-mを使用できます


私が使っていUbuntu 10.04.2 LTSて、そのコマンドが存在しません...
クリスチャン

2
tmpreaper代わりに@Kristianを確認してください。
slhck

これらを使用してnoatimeオプションでマウントされたファイルシステムを管理する際の落とし穴はありますか?
AnonymousLurker

@AnonymousLurker私はあなたのために答えを変更しました
WojonsTech

6

次のコマンドを使用すると、ファイルごとに新しいプロセスが生成されるのを回避できます

find cache* -mtime +30 -delete

3

上記をniceで実行してみてください:

nice -n 39 find cache* -mtime +30 -exec rm -f {} ';'

この方法では、他に何も実行する必要がない場合にのみ巨大な負荷が発生します。それ以外の場合は、他のプロセスが優先されます(そのナイスネスが19未満、つまり最大の場合)。

-nオプションの引数は-20から19までのデフォルトのnicenessに追加されることに注意してください。元のnicenessに関係なく、非常に nice になるよう 39を使用しました。


2

chiborgがコメントしたように、ロードは、見つかったすべてのファイルに対してrmを開始するためです。がtmpwatch代替案として提案されている答えに気づきましたが、それはきっとうまくいきます。ただし、必須ではありません。

検索は、見つかったファイルを次のように引数のリストに蓄積するように指示すると、execに指定されたコマンドを1回実行できます。

find /path -name "*.moo" -exec rm {} \+

引数リストがシェル(getconf ARG_MAX)で許可されている最大値(バイト単位)より大きくなる可能性があるため、これが機能しないことがあります。これは、-Lオプションを指定したxargsで解決できます。

この例を考えてみましょう:

$ echo 0 > /tmp/it; 
$ for i in {0..15000};do echo $i;done  |\
    xargs --no-run-if-empty -L 5000 ./tmp/xr.sh 
Iteration=0; running with 5000 arguments
Iteration=1; running with 5000 arguments
Iteration=2; running with 5000 arguments
Iteration=3; running with 1 arguments

$ cat tmp/xr.sh 
#!/bin/sh
IT=`cat /tmp/it`
echo Iteration=$IT\; running with $# arguments
let IT=IT+1
echo $IT > /tmp/it

したがって、追加のソフトウェアをインストールする必要はありません。必要なのはgnu-findutilsだけです。

find /path -mtime +30 -print0 | xargs -0 -L 5000 rm 

一部のd00dは、検索とxargsに-print0と-0を追加すると便利だと考えていました。これらの引数は、コマンドを強制的に改行(\ n)ではなくnull文字(\ 0)を使用して引数を区切ります。これは、ファイル名にスペースまたは改行が含まれている場合に役立ちます。
ЯрославРахматуллин

(1)言う必要はありません\+。無地+で十分です。(2)これは、「引数リストが大きくなる可能性があるため、機能しない...」ではありません。  find  … -exec … {} +同じことをxargs行います。必要なだけコマンドを実行します。たとえば、(例のように)15001から20000までのファイルがある場合find-exec'dプログラム(rm)は4回実行されます。
G-Manは 'Reinstate Monica'を
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.