dポイントプレゼントキャンペーン実施中!

linuxのシェルでファイル名に先月以前の日付があるのを削除したい

bashでcshellでも良いのですが、
/pgsql/data/pg_log/
の下にたまったlog
postgresql-2010-04-01-*.log
postgresql-2010-03-31-*.log
postgresql-2010-03-30-*.log
などのうち、
先月以前の日付があるのを削除するスクリプトを作りたいのですが、上手くいきません。

ls postgresql*.logから全件数回して、if文で比較しようとしましたが、判定がうまくいきません。


何がネックになっているかと言いますと、
文字列「postgresql-2010-04-01-*.log」
文字列「postgresql-2010-04」をif文で比較すると、=の判定はできますが、
>や<で判定すると、全てthenになってしまいます。
文字の大小比較はできないようですね?


また、
「postgresql-2010-04-01-*.log」
から、12文字目から7文字抜き出したいのですが、
substrのような事も出来るのかどうなのか分かりません。

bashでこういう事をするのはあまり向いていないのでしょうか?
cshellとどちらが向いているでしょうか?
あるいはパールなんかを使った方が良いのでしょうか?

当面のやりたい事をクリアする方法、および、ツールの選定についてご教授下さい。

以上、よろしくお願いします。

A 回答 (2件)

ファイル名でなく、タイムスタンプが30日以前で削除するなら、#1の方が書いたようにfindを使うのが良いです。



find /pgsql/data/pg_log/ -name '*.log' -mtime +30 | xargs -r rm

> < の判定が失敗したのは、

if [ $file < postgresql-2010-04 ] のように書いたのではありませんか? < や > はそのまま書くとリダイレクトの記号なので、if [ $file '<' postgresql-2010-04 ] のように書かないといけません。

>12文字目から7文字抜き出したいのですが、

${file:11:7} のように書きます。先頭を0と数えるので12文字目は11になります。

>bashでこういう事をするのはあまり向いていないのでしょうか?cshellとどちらが向いているでしょうか?あるいはパールなんかを使った方が良いのでしょうか?

cshよりbashのほうが高機能です。この程度であれば、シェルで十分です。

YYYYMM=`date +%Y-%m`
cd /pgsql/data/pg_log/
for file in postgresql-*.log
do if [ $file '<' postgresql-$YYYYMM ];then rm $file;fi
done
    • good
    • 2
この回答へのお礼

ありがとうござます。

当面の事、そしてプラン的なものも分かりました。

お礼日時:2010/05/06 23:07

find /pgsql/data/pg_log/ -name '/pgsql/data/pg_log/' -ctime +30 -

{} \;
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2010/05/06 23:07

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