2008年09月26日

コマンドラインで一ヶ月分のファイル名を作る

livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

コマンドラインで連番のファイル名を作る から派生


月次の処理をしたい場合があるはず。
  • 一ヶ月分のファイル名を作る
  • 年と月を指定可能にする
こんな条件だと、コマン道ではこう書く。

$ 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
31
1日ずつ出て来た。




ループ内の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で出力を整形
さ〜て、Perlやzshではどう書くんだろうか?
ネタふりをしてみる。


トラックバック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 ...

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔