- ベストアンサー
古いファイルやディレクトリを消したい(Linux)
Linux で不要な古いファイルやディレクトリを消したいのですが、 どのようにすればいいのかわかりません。 具体的にはあるディレクトリの中にある 新旧混在となったファイルやディレクトリの中から 1ヶ月以上前に作ったファイルやディレクトリを消すといったことが したいのです。 もちろんディレクトリの中に新しいファイルがいたら、 親ディレクトリは残すことを考えています。 find で -ctime +7 というオプションをつけて検索すれば 候補が得られるというところはわかったのですが、 ディレクトリもいるので簡単に rm では消せません。 rm -r なんてしたら新しいファイルも消しちゃうので・・・ どうか、お知恵をお貸しください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Linux なら find で -print0 が使えるし, xargs にも -0 ってオプションがあるはず. find の -exec では 1つのファイルに対して 1回コマンドを実行するけど, xargs ならカーネルが許す限り長いコマンドを作って実行するので, -exec より xargs の方が fork&exec の回数が少なくなって効率的なはずです. と思ってちょっと調べてみたけど, Wikipedia で xargs を調べてもらった方がいいかも.
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
ど~でもいいけど, find の -exec より xargs の方がほぼ間違いなく効率的.
お礼
回答ありがとうございます。 昔は Tacosan のように思っていたのですが、 スペースを含むファイル名を扱う場合に xargs が正しく処理できないことが出てきて、 今では -exec を使っています。 ちなみに、xargs が効率的というのはどういったことがでしょうか? 実は今もいろいろ試行錯誤しているのですが、 xargs でスペース付きの名前をやり取りする方法が見つかれば 一気に幸せになれます。。。。 ちなみに今の状況は以下のようになっています。 /pub/temp の下にあるファイルに対して処理を行っています。 find /pub/temp/ -cmin +7 -type d > /tmp/__rm_pub_temp.list find /pub/temp/ -cmin +7 -exec rm {} \; >&/dev/null cat /tmp/__rm_pub_temp.list | xargs rmdir >&/dev/null
- g_liar
- ベストアンサー率52% (382/728)
古いファイルの削除と空きになったディレクトリの削除を1度で行うのは無理かも? 2回に分けてfindを発行してはどうでしょうか? 1回目。 find 先頭ディレクトリ -type f -mtime +7 -exec rm -f {} \; ※ctimeだとファイルの作成日が対象になります。 ※7日前に作成され、何かの理由で1日前に更新されたファイルは消えます。 ※mtimeだと更新日(新規ファイルなら更新日=作成日)で見ますので ※こちらの方が良いかと。 2回目(ちょっと強引な手かもしれませんが) find 先頭ディレクトリ -type d -exec rmdir {} \; ※rmdirは空でないディレクトリは削除しません。 ※1回目のfindを実行した結果、空になったディレクトリが消えます。 ※rmdirのメッセージが鬱陶しい時は >&/dev/null を{}の後ろに付けます。 実際に試したわけではないので参考意見として。
お礼
回答ありがとうございます。 今もいろいろ試行錯誤と悪戦苦闘してます。 mtimeでは他からファイルをコピーしたとき、 古いタイムスタンプであった場合に消されてしまうのでアウトでした。 ctime なら、持ってきた日になるのでこちらを採用しています。 理想的には atime が良かったのですが、 find を実行すると atime が更新されてしまい、不採用です。 またrmdir については、空ディレクトリが構造にある場合に 問答無用で消されてしまいます。 急に temp用ディレクトリ がなくなったとかで 既に駄目ダシされてしまいました。 ディレクトリ直下でファイルの変更などがあると、 親ディレクトリのctime/mtime 情報も変わってしまい、 ディレクトリを含めた処理に難しさを感じています。 でも今思いついたのですが、-ctime と -type d の組み合わせで 行けば何とかなりそうですね。 アクティブな空ディレクトリは残せそうです。
- SAYKA
- ベストアンサー率34% (944/2776)
findの結果をパイプしてrm じゃない? http://www.google.com/search?lr=lang_ja&q=%E3%82%B7%E3%82%A7%E3%83%AB%20%E3%83%91%E3%82%A4%E3%83%97
お礼
回答ありがとうございます。 パイプして xargs とか使わなくても、-exec を使えば削除はできます。 問題だったのは rm ではターゲットとなるディレクトリが 適切に消えてくれないということでした。 よく読むと質問が初心者っぽい内容でした。
お礼
print0 というオプションを知りませんでした。man して納得しました。まさにこれでした。 xargs についても Wikipedia で確認してみました。 いろいろテスト用にディレクトリやファイルを作成して動かしてみましたが、今のところ理想どおりの動きをしています。 すばらしいヒントありがとうございました! スクリプトは最初のディレクトリの時間情報を保管する find で -print0 を、その情報をもとに空になっているディレクトリだけを削除する xargs の引数に -0 をつけることで、当初のベンチマークに対して幸せになれました。 今はさらに -exec から xargs に変更して、とりあえず完成かと考えています。