2014年2月7日金曜日

find で、「-exec rm」 でエラーになった時の回避法


ちょっと findで ハマってしまったので、メモです~


もくじ


きっかけ

ある日、以下のような定期実行の失敗メールが来て原因が分かりませんでした。
+ find /var/lib/jenkins/jobs/areyakoreya/builds -ctime +90 -exec rm -rf '{}' ';'
find: `/var/lib/jenkins/jobs/areyakoreya/builds/2013-11-07_13-58-29': そのようなファイルやディレクトリはありません
find: `/var/lib/jenkins/jobs/areyakoreya/builds/2013-11-07_12-58-29': そのようなファイルやディレクトリはありません
find: `/var/lib/jenkins/jobs/areyakoreya/builds/2013-11-08_00-58-29': そのようなファイルやディレクトリはありません

調べてもらったw

で、会社のエンジニアさんに調べてもらったら、Yahoo!知恵袋様がかかったので、忘れないようにブログですね!
Linux findコマンドについて - Yahoo!知恵袋

対策法

対策法としては以下の3つ
  • find + -exec に変わりfind | xargs rm -r にする
  • find /path -maxdepth 1 -name 〜 -exec rm -r {}¥; とする
  • エラーを/dev/nullに渡す。 2>/dev/null ← 僕のポリシー上これはナシ!

結局
階層の深さが決まっているので、
find /path -maxdepth 1 -name 〜 -exec rm -r {}¥;
を採用!

対策済み例

find /var/lib/jenkins/jobs/areyakoreya/builds -maxdepth 1 -ctime +90 -exec rm -rf {} \;

まとめ


  • 原因は、「findをする対象のデータがすでに前の処理で削除されているから」でした!
  • 特に「rm -rf」何かしてディレクトリを削除するときは気をつけた方がいいという初歩的なものでした・・・
  • 定期実行の部分に「 > /dev/null 」と書きたくない! snicker_jp でした~

弊社 K さん!ありがとう!☆ミ
Yahoo!知恵袋の回答者さんもありがとう!

画像提供

photo by pakutaso.com

Zenback