- ベストアンサー
ディレクトリを削除するシェルスクリプト
Linuxにて、あるディレクトリ内の子ディレクトリの作成日が1ヶ月以上前のものを削除するシェルスクリプトを作成したく思っております。 対象のディレクトリには名前の一部に作成日(YYYYMMDD)を付与していますのでそれを利用してどうにかできないかと考えております。ただ実際にどう実現すればいいか分からず困っています。何か良い案がある方がいらっしゃればご教授願いたく思っております。 OS:REDHAT Enterprise Server4(カーネル:2.6.9-67)
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
「当該ディレクトリの中にあるもの」を一緒に消していいなら ・「1ヶ月以上前に作られたもの」なら find でリストアップ ・xargs で rm に送る という手段でできる, ような気がする.
その他の回答 (2)
- astronaut
- ベストアンサー率58% (303/516)
すでに回答がついているとおり、findで対応できるならそれが simple is best. ただし、ctimeは、ディレクトリの内容が変化すると変わってしまうので、どうしてもディレクトリ名によりたいという場合は、ということで、サンプルを書いてみました。 $topdir以下に存在する全てのディレクトリの名前を調べて、dateコマンドの %sオプション(1970-01-01 00:00:00 UTC からの秒数)を使って、作成日午前0時からの経過秒数を求め、31日x86400秒以上経過しているディレクトリを削除します。エラー処理とか全然やってませんのでご注意を。 #!/bin/bash topdir=hogehoge expire=$((86400*31)) SEC=`date +%s` dirlist=`find $topdir -type d` for path in $dirlist do dir=`basename $path` if echo $dir | grep -e '[0-9]\{8\}' >/dev/null 2>&1 ; then date=`echo $dir | sed 's/^.*\([0-9]\{8\}\).*$/\1/'` sec=`date +%s -d $date` age=$(($SEC-$sec)) if [ $age -gt $expire ]; then rm -rf $path fi fi done
お礼
>findで対応できるならそれが simple is best. そうですね。おっしゃるとおりです。やはりSimple is Best行くべきですね。頂いたコードはシェルスクリプトの勉強の参考にさせていただきたいと思います。ありがとうございました。
- lowrider_2005
- ベストアンサー率40% (1520/3748)
たとえばこんな感じでできませんか? find . -ctime +30 -type d -exec rm -fr {} \;
お礼
ありがとうございます。こちらでもできました。 {}と\;の間にスペースを入れ忘れ、 missing argument to `-exec' が出て、しばらくの間悩んでました。。
補足
早々の回答ありがとうございます。 頂いた方法でできそうです。 「1ヶ月以上前のもの」をリストすると、親ディレクトリ自体(これは消したくない)も引っかかりましたが、他のオプションを使うことで欲しい結果である「子ディレクトリの中で1ヶ月以上前のもの」にすることができました。そして、パイプでつないでxargs rm -rfでうまく消えました。 ファイル属性の更新日を使った削除はこれでいけると思います。ありがとうございますm(_ _)m ほかの方法として、ディレクトリ名につけたYYYYMMDDを使って、YYYYMMDDが1ヶ月以上前であれば消すということは不可能でしょうか?