質問: 数百KB程度の画像データのキャッシュが、複数の階層に分かれて数百万ファイルあります。 この中で作成日時が1週間以上前のファイルを定期的に削除したいと思っております。 現在、findコマンドを使って削除を試みたところ、iowaitが酷い状態で、毎日実行したいのに、実行完了まで2日かかる状況です。 こういったニーズを「Linux上」で「軽いシステム負荷」で実現するための方法を教えて頂けませんでしょうか? Linux上で1週間以内に作成されたファイルのみが保持されることが目的さえ満たせれば、何かしらのOSS製品を組み合わせる方法でも構いません。 なお、HDDを定期的に初期化をする方法ですと、キャッシュが再生成されるまでシステムが高負荷となってしまうため現実的ではありません。 【環境】 Linux CentOS 5.5 x86_64 HDD: SATA 2TB RAID-1(BBU付きのサーバ用RAIDカード) ファイルシステム:ext3 ※ Windows・Mac用のソフト紹介はご遠慮お願いします
回答: 発想を逆転して、1週間以内のキャッシュを残すようなロジックではどうでしょうか? つまり、 1キャッシュディレクトリごと一旦リネーム(例ではcache4delete) 2キャッシュディレクトリ再作成(cache) 31週間以内のキャッシュのみ2に移動 41でリネームしたディレクトリ削除 です。 以下がそれっぽいシェルコマンドですが、findでヒットするファイル名が"./"付きのため "mv: rename . to ../cache/.: Invalid argument"とエラーメッセージが表示されてしまいますので修正が必要そうです。 このあたりの処理はko-takadaさんのほうが詳しいかも知れませんね。 $ mv cache cache4delete $ mkdir cache $ cd cache4delete $ find . -ctime -7 -exec mv '{}' ../cache/ ';' $ cd .. $ rm -rf cache4delete