好きな「お肉」は?

Linuxにて、あるディレクトリ内の子ディレクトリの作成日が1ヶ月以上前のものを削除するシェルスクリプトを作成したく思っております。
対象のディレクトリには名前の一部に作成日(YYYYMMDD)を付与していますのでそれを利用してどうにかできないかと考えております。ただ実際にどう実現すればいいか分からず困っています。何か良い案がある方がいらっしゃればご教授願いたく思っております。
OS:REDHAT Enterprise Server4(カーネル:2.6.9-67)

A 回答 (3件)

「当該ディレクトリの中にあるもの」を一緒に消していいなら


・「1ヶ月以上前に作られたもの」なら find でリストアップ
・xargs で rm に送る
という手段でできる, ような気がする.

この回答への補足

早々の回答ありがとうございます。
頂いた方法でできそうです。
「1ヶ月以上前のもの」をリストすると、親ディレクトリ自体(これは消したくない)も引っかかりましたが、他のオプションを使うことで欲しい結果である「子ディレクトリの中で1ヶ月以上前のもの」にすることができました。そして、パイプでつないでxargs rm -rfでうまく消えました。
ファイル属性の更新日を使った削除はこれでいけると思います。ありがとうございますm(_ _)m
ほかの方法として、ディレクトリ名につけたYYYYMMDDを使って、YYYYMMDDが1ヶ月以上前であれば消すということは不可能でしょうか?

補足日時:2008/08/11 17:15
    • good
    • 1

すでに回答がついているとおり、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
    • good
    • 1
この回答へのお礼

>findで対応できるならそれが simple is best.
そうですね。おっしゃるとおりです。やはりSimple is Best行くべきですね。頂いたコードはシェルスクリプトの勉強の参考にさせていただきたいと思います。ありがとうございました。

お礼日時:2008/08/12 13:16

たとえばこんな感じでできませんか?



find . -ctime +30 -type d -exec rm -fr {} \;
    • good
    • 0
この回答へのお礼

ありがとうございます。こちらでもできました。
{}と\;の間にスペースを入れ忘れ、
missing argument to `-exec'
が出て、しばらくの間悩んでました。。

お礼日時:2008/08/12 13:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報