2008年09月26日
コマンドラインで連番のファイル名を作る から派生
月次の処理をしたい場合があるはず。
- 一ヶ月分のファイル名を作る
- 年と月を指定可能にする
$ year=2008; mon=10; for i in $(LC_ALL=C cal $mon $year | egrep -v '[a-z]'); do printf "access_log.%04d%02d%02d\n" $year $mon $i; done access_log.20081001 access_log.20081002 access_log.20081003 access_log.20081004 access_log.20081005 access_log.20081006 access_log.20081007 access_log.20081008 access_log.20081009 access_log.20081010 access_log.20081011 access_log.20081012 access_log.20081013 access_log.20081014 access_log.20081015 access_log.20081016 access_log.20081017 access_log.20081018 access_log.20081019 access_log.20081020 access_log.20081021 access_log.20081022 access_log.20081023 access_log.20081024 access_log.20081025 access_log.20081026 access_log.20081027 access_log.20081028 access_log.20081029 access_log.20081030 access_log.20081031
分解して解説して行く
まずはcalコマンドの部分
$ year=2008; mon=10; LC_ALL=C cal $mon $year
October 2008
Su Mo Tu We Th Fr Sa
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
LC_ALL=Cとして居るのは日本語表示されると都合が悪いからだ。日本語だと「egrep -v '[a-z]'」で上手くフィルタ出来ない。
$ year=2008; mon=10; cal $mon $year | egrep -v '[a-z]'
10月 2008
日 月 火 水 木 金 土
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
こうなる。それに対し、LC_ALL=Cを入れると上手く行く。
$ year=2008; mon=10; LC_ALL=C cal $mon $year | egrep -v '[a-z]'
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
この通り。数字だけ抜き出せた。
次はforループ
forのリスト部分は、改行かスペースを区切り文字として扱ってくれる。
whileとreadの組み合わせでは都合が悪い。
cal+egrepの結果をforのリストにする。
$ year=2008; mon=10; for i in $(LC_ALL=C cal $mon $year | egrep -v '[a-z]'); do echo $i; done 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 311日ずつ出て来た。
ループ内のprintf
あとはechoをprintfに変え、$yearと$monを含めて出力する。
$ year=2008; mon=10; for i in $(LC_ALL=C cal $mon $year | egrep -v '[a-z]'); do printf "access_log.%04d%02d%02d\n" $year $mon $i; done access_log.20081001 access_log.20081002 access_log.20081003 access_log.20081004 access_log.20081005 access_log.20081006 access_log.20081007 access_log.20081008 access_log.20081009 access_log.20081010 access_log.20081011 access_log.20081012 access_log.20081013 access_log.20081014 access_log.20081015 access_log.20081016 access_log.20081017 access_log.20081018 access_log.20081019 access_log.20081020 access_log.20081021 access_log.20081022 access_log.20081023 access_log.20081024 access_log.20081025 access_log.20081026 access_log.20081027 access_log.20081028 access_log.20081029 access_log.20081030 access_log.20081031出来上がり。
まとめ
- calとegrepを組み合わせて日付リストを生成
- forの特性を生かしてリストを分解
- printfで出力を整形
ネタふりをしてみる。
トラックバックURL
この記事へのトラックバック
1. Re: コマンドラインで一ヶ月分のファイル名を作る [ 本を読む ] 2008年09月27日 10:10
コマンドラインで一ヶ月分のファイル名を作る
$ year=2008; mon=10; for i in $(LC_ALL=C cal $mon $year | egrep -v '[a-z]'); do printf "access_log.%04d%02d%02d\n" $year $mon ...