ファイルのタイムスタンプを取得しリネームする方法に続いて、YYYYMM(年+月)ディレクトリごとに分ける方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/bin/sh TARGET_BODY=access* TEMP=mv_yyyymm.tmp.$$; ls -lrt --time-style='+%Y%m' $TARGET_BODY | awk '{printf "%s/ %s\n",$6,$7; }' > $TEMP; while read TARGET_DIR TARGET_FILE do if [ ! -d $TARGET_DIR ];then echo "mkdir!"; mkdir $TARGET_DIR; else echo "exist!"; fi mv $TARGET_FILE $TARGET_DIR; done < $TEMP; rm $TEMP; |
一時ファイル(mv_yyyymm.tmp.PID)を作成するのが気に入らないが・・・
ただし、Apacheのアクセスログの整理の場合などは、これでは不十分な
場合が多い。
なぜなら、ログローテートされるタイミングによっては、2007年1月31日分の
ログファイルのタイムスタンプは、2月1日になるので、最終日分のみ常に
翌月ディレクトリに移動されてしまう。
そのため、上記はそれ以外の用途で本当にファイルのタイムスタンプに
応じた移動をしたい場合に使うものになる。
というわけで、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/bin/sh TARGET_BODY=access* TARGET_LIST=`ls -lrt $TARGET_BODY | awk '{printf "%s ",$9;}'`; for TARGET in $TARGET_LIST do TARGET_DIR=`echo $TARGET | awk '{split($1,targetName,"\.");print substr(targetName[2],0,6);}'`; if [ ! -d $TARGET_DIR ];then echo "mkdir!"; mkdir $TARGET_DIR; else echo "exist!"; fi mv $TARGET_FILE $TARGET_DIR; done |
こんなshellを書けば、access_log.20070101~access_log.20070131までが、
200701/ ディレクトリに正しく移動できる。
YYYYMMディレクトリ名はファイル名末尾のaccess_log.YYYYMMDDから
“.”(ドット)をセパレータとして、2つめのフィールドを取得し、かつ0バイト目
から6バイト(文字)を採用しているので、移動対象となるTARGET_BODYの
命名ルールによっては変更が必要。
たとえば・・・
access.log.20070101 形式の場合なら
1 |
TARGET_DIR=`echo $TARGET | awk '{split($1,targetName,"\.");print substr(targetName[3],0,6);}'`; |
という変更が必要になる。
この場合、
1 |
TARGET_BODY=access* |
は、とくに変更不要。
No comments yet. You should be kind and add one!
By submitting a comment you grant typista a perpetual license to reproduce your words and name/web site in attribution. Inappropriate and irrelevant comments will be removed at an admin’s discretion. Your email is used for verification purposes only, it will never be shared.