本を読む

読書やコンピュータなどに関するメモ

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

$ 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
さ~て、Perlやzshではどう書くんだろうか?
ネタふりをしてみる。

 これいいですね。calの結果をほぼそのままforに食わせるというのがシンプルで確実。実用コマン道としてベスト解なんじゃないでしょうか。

 以下、私がちょっとほかの方法を試行錯誤してみた、実用的じゃない例です。方法そのものはともかく、モジュールやコマンドの挙動は自分の勉強になりました。

Perlで

 DateTime->last_day_of_month()で月末を求めてループする方法です。ワンライナーで使うには長い。

$ perl -MDateTime -e '$y=2008; $m=12; printf "access_log.%04d%02d%02d\n", $y, $m, $_ for (1..DateTime->last_day_of_month(year=>$y, month=>$m)->day)'

dateコマンドで

 GNU系のdateに「1日の1か月後の1日前」を指定して月末を求める方法です。なんかまどろっこしい感じ。

$ y=2008; m=12; e=$(date -d "$y-$m-1 +1 month -1 day" +%d); for ((i=1; i<=$e; i++));do printf 'access%04d%02d%02d\n' $y $m $i; done

zshのzsh/datetimeモジュールで

 strftime -r(Cのstrptime()相当)がどの月でも31日まで受け付けるので、その結果をstrftimeにかけて、翌月にならない日を表示する方法です。こんなややこしいことワンライナーでやりません。

% zmodload -i zsh/datetime
% y=2008; m=12; for ((i=1; i<=31; i++));do strftime -r -s e %F $y-$m-$i || break; strftime -s d access_log.%Y%m%d $e; [[ $d == *$i ]] && echo $d; done

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/455-6b3c03bf

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad