[shell] 日付を便利に取得する

2015年7月5日

Shell プログラミング

shellコマンドの「date」には、そのへんのWEBプログラム言語に匹敵するぐらい便利なオプション機能がいくつもある。 以前、ミリ秒の取得を行なったが、今回は、現在時間を基準に、1時間前、1日前、1ヶ月前、1年前・・・ などという風に柔軟に取得することができる。

3時間前を取得

#現在時刻を取得 $ date +%Y%m%d%H%M%S 20150627223752 #3時間前 $ date +%Y%m%d%H%M%S -d '3 hour ago' 20150627193801

サンプル

-dをつけて'3 hour ago'とすると3時間前 他にも以下のようにセットできる 3日前:'3 day ago' 3ヶ月前:'3 month ago' 3年前:'3 year ago' 1ヶ月と10日前:'1 month ago 10 day ago'

サンプル2

前の日付だけでなく、後の日付を取得するには"ago"をつけなければいい 3日後:'3 day' 3ヶ月後:'3 month' 3年後:'3 year' 1ヶ月と10日後:'1 month 10 day'

対象ファイルの3日前より古いデータを削除

data_********.dat (********は年月日が数値で入る) remove_data.sh #!/bin/sh #基準日時取得 TARGET_DATE=`date +%Y%m%d%H -d '3 day ago'` #基準日表示 #echo $TARGET_DATETIME #対象ファイルの一覧取得 FILES=`ls data_*.dat` #ファイル一覧の個別処理 for i in $FILES do #ファイル名を取得 FILENAME=`basename $i` #対象時間より小さい(過去)の日付が削除対象 FLG=`echo $FILENAME|awk -F_ '{gsub(".dat","",$2);if($2< '$TARGET_DATE'){print $2}}'` #文字列があるものだけ削除 if [ -n "$FLG" ];then echo $FLG rm $i fi done 世代バックアップの3日より古いデータを削除するような場合に使えます。 3日を3時間や3ヶ月などと変えると世代管理に柔軟に対応できますよ。 また、ファイル名は色々なパターンがあるのですが、ファイルのタイムスタンプを基準にすることも可能ですが、その際はawkの中身を変更して使ってください。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。