みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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とどちらが向いているでしょうか?
あるいはパールなんかを使った方が良いのでしょうか?

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

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

投稿日時 - 2010-04-29 23:07:52

QNo.5860783

困ってます

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

ファイル名でなく、タイムスタンプが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

投稿日時 - 2010-04-30 01:09:22

お礼

ありがとうござます。

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

投稿日時 - 2010-05-06 23:07:07

ANo.2

このQ&Aは役に立ちましたか?

18人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

find /pgsql/data/pg_log/ -name '/pgsql/data/pg_log/' -ctime +30 -exec rm -f {} \;

投稿日時 - 2010-04-29 23:20:26

お礼

ありがとうございます。

投稿日時 - 2010-05-06 23:07:40

あなたにオススメの質問