• ベストアンサー

findコマンド/複数の指定ディレクトリ以下にある、古いファイルを削除する処理を自動実行したい

▽やりたいこと abcde/cache/以下にある、1日以上前にあるファイルを全削除するにはどうすればよいでしょうか。 abcde/cache/ファルダは、複数あります。 まず初めにsshで接続して、実際にファイルを探し、削除してから、cronなるものにチャレンジしようと思っていましたが、一番初めのファイルを探すところで躓きました。 find . -name "cache"だと、消したくない、cacheフォルダまで、 検索されてしまうので、 まずは、複数あるabcde/cache/フォルダを探す方法を知りたいです。 ▽step0(ssh) abcde/cache/フォルダを探す ▽step1(ssh) abcde/cache/フォルダ以下のファイル全削除 ▽step2(ssh) abcde/cache/フォルダ以下の、1日以上前にあるファイルを全削除 ▽step3(cron) 上記をcrondで実行 ヒントだけでもよいので、誰か教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.6

abcdeの下ってそういう意味でしたか。 それならばこうです。 find . -type f -regex '.*/abcde/cache/[^/]*' -print 実際に消去するには -print を -exec rm -f \{\} \; に。 crontabに書くには . ではなくフルパスで。

re999
質問者

お礼

▼1.について find . -type f -regex '.*/abcde/cache/[^/]*' -print 今、念のためもう一度試したら、望みどおりの結果がちゃんと表示されました。ちゃんと確かめてから投稿したつもりだったのですが...。申し訳ありません........。

re999
質問者

補足

ありがとうございます。 アドバイスのおかげで、ものすごく進展した気がします。 もしよければですが、さらに二点教えてください。 ▼1. find . -type f -regex '.*/abcde/cache/[^/]*' -print を試すと、 Permission denied となってしまいます。なぜでしょうか? Permission deniedのとことろで引っかかっているのでしょうか? ちなみに、 find -regex '.*/abcde/cache/[^/]*' とやると、自分の期待したファイル結果を表示することができたのですが、この書き方では、crontabに書けないでしょうか? ▼2 >abcdeの下ってそういう意味でしたか。 皆さんのアドバイスで共通していたのが、 find で /abcde 以下の cache ディレクトリをみつけるだけなら find /abcde -name cache ググッてみても、aディレクトリ以下を探す find /a みたいな書き方をされていたのですが、 今回のケースで、この書き方では、なぜ期待通りの結果が得られないのでしょうか? 今後の参考までに教えていただければ、幸いです。

その他の回答 (5)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

find で /abcde 以下の cache ディレクトリを全部みつけるだけなら find /abcde -name cache で OK. あと, 「うまくいきません」というときには何がどう「うまくいかない」のかをちゃんと書いてください. どういう状況で何が得られることを期待して, 実際にはどんな結果になったのか, ですね.

re999
質問者

補足

■find . -name "cache"を試すと、下記が表示されます ./public_html/rails/modules/abcde/cache ./public_html/ruby/modules/wiki/private/cache ./net/cache ./n/abcde/cache  : 以下略 ■この例でいくと、期待しているのは、下記二つを検出したいのですが、 ./public_html/rails/modules/abcde/cache ./n/abcde/cache ■find /abcde -name cacheを実行すると、下記結果となります find: /abcde: No such file or director

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

まず訂正です >-ctime -1 これは1日以内でした。1日以上は+1です。 >「cache」フォルダだけを探すと、削除したくないファルダもあるので、/「abcde」フォルダ以下の「cache」フォルダ内のファイルだけを削除したいのですが、そんなことはできるのでしょうか。 /abcde の下の深いところにcacheフォルダがあって、その直下のファイルを消したい、ということでしょうか cacheフォルダの中の深いところまで辿ってファイルを消したい、ということでしょうか /abcdeから開始するので find /abcde ファイルなので -type f 1日以上前を作成日で判断するなら -ctime +1 変更日で判断するなら -mtime +1 肝心のファイル名の判定ですが, -regexを使って書けると思います。 cache直下なら、cache/の後に/が無いはずなので -regex '.*/cache/[^/]*' cache以下なら、/を含めて任意の文字が来るので -regex '.*/cache/.*' まずは、-printで期待通りのファイルが表示されるか、確認してみましょう

re999
質問者

補足

まずファイル表示からやってみたのですが、 うまくいきません。下記のどこがいけないのでしょうか? find /abcde -type f -regex '.*/cache/[^/]*' -print

回答No.3

find /abcde/cache/* -type -mtime +1 -exec /usr/bin/rm -f {} \;

re999
質問者

補足

find: invalid argument `-mtime' to `-type'となります。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

find で /abcde 以下の cache ディレクトリを全部みつけ, xargs で再度 find する. 削除は find の -exec を使ってもいいしさらに xargs でも OK.

re999
質問者

補足

>find で /abcde 以下の cache ディレクトリを全部みつけ もし、ご存知でしたら、この方法を教えてください。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

man find でfindのオプションを確認できます。 step0 abcdeの深さは一緒でしょうか? a/cache b/c/cache 等と深さも変わるのでしょうか? 深さが一緒なら、開始ディレクトリは複数指定可能なので find */cache という感じで指定できます。 step1/step2 全部消すのですか?1日以上前を消すのですか? -type f でファイルを対象とできます。 -ctime -1 で 1日以上前に作成されたファイルを指定できます。 step3 crontabを使いましょう。 詳細はcrontabで検索してください 注意点としては、相対パスは使わない(findではなく/usr/bin/find等)ことでしょうか

参考URL:
http://www.linux.or.jp/JM/html/GNU_findutils/man1/find.1.html, http://www.linux.or.jp/JM/html/cron/man1/crontab.1.html
re999
質問者

補足

ご回答ありがとうございます。 >abcdeの深さは一緒でしょうか? a/cache b/c/cache 等と深さも変わるのでしょうか? 深さは違います。 <補足> 「cache」フォルダだけを探すと、削除したくないファルダもあるので、/「abcde」フォルダ以下の「cache」フォルダ内のファイルだけを削除したいのですが、そんなことはできるのでしょうか。 ※「abcde」フォルダ以下の「cache」フォルダは、異なる階層に、複数存在しています。

関連するQ&A