nounai.output(spaghetiThinking);

趣味と実益を兼ねて将棋プログラム(研究ツールなど)を作ってみたいと思う私の試行錯誤とか勉強したことを綴ってゆく予定です。 主目的はプログラミングの経験値稼ぎですが、コンピュータ将棋の製作も目指してみたいとも考えています。

棋譜アーカイブの月別分類

floodgateで入手できる棋譜はアーカイブされてて非常に利用しやすいです。日付ごと、対局者ごとにまとめられているのがありますが、リンクを1個1個クリックしていくのがあまりにめんどいので、ひとまず2012年、2011年分の1年区切りのアーカイブを落としてみたら、1年の対局数が10万くらいあってlsコマンドがもの凄い遅い。だいたいは標準出力に吐いてるせいだろうし棋譜の学習にはそこまで差し障らないかと思うけど、1ディレクトリに10万もファイルがあるのは個人的に気持ち悪いなと思い、スクリプト使って月別に一括分類したいなーって考えた時の話。


1年分のアーカイブを展開し、そのディレクトリの中に入って使うことを想定してます。 しょぼいですけどソースは以下のような感じになります。2012年のアーカイブを展開して"2012"ディレクトリに棋譜が入ってる場合しか考えてないコードなので、ソース後半に現れる"2012"のディレクトリ名はを適宜直す必要があります。

#!/bin/bash
for i in `seq 1 12`
do
        dir=""
        if test $i -lt 10
        then
                dir='0'$i
        else
                dir=$i
        fi
        echo "\"mkdir $dir\""
                
        mkdir -p $dir
        ls|grep -e "$2012""$dir""[0-9]\{8\}.csa"|xargs mv -t $dir
done

mvのオプションとか正規表現とかシェルスクリプトとか、そこまで手に馴染んでなかったのでいい練習になりました。普段あんまり使わない筋肉を使って運動したみたいな感じで。

参考

シェルのfor,if文はちょいちょい忘れてしまう。seqとかtestとかfiとか。