sed でファイルをリネームする

この Pelican で作っている blog の設定を少し変更したため、記事ファイルをリネームする必要が出てきました。これまでは 2014-0817-2330_43.rst というふうにファイル名に日付と時刻を入れて slug として通し番号をつけていました。

Pelican では entry のメタデータをファイル名の文字列から引っ張ってくることができるので、この blog でもそのようにしてみます。こちらの blog で解説されていました。

設定自体は簡単で pelicanconf.py に下記のように追加するだけです。

FILENAME_METADATA = r'(?P<date>\d{4}-\d{2}-\d{2})_(?P<slug>.*)'

日付の年月日と slug 文字列をアンダーバーでつなぐ形になります。こんな感じ 2014-08-17_43.rst です。

ファイルをリネームする

もとのファイル名にも日付と slug が入っていたので少しいじるだけでリネームできるのですが、さすがに数十件ものファイルを手作業で修正するわけにはいきません。shell でこう、サクッとできるはずなので調べると sed で正規表現の置換ができるようなのでそれでやってみることにしました。

$ for file in *.rst; do mv $file `echo $file | sed 's/^\([0-9]\{4\}\)-\([0-9]\{2\}\)\([0-9]\{2\}\)-[0-9]\{4\}/\1-\2-\3/'`; done

sed ではグルーピングで使用する丸括弧 ( ) や、量指定子で使用する波括弧 { }\ でエスケープする必要があるみたいで何だか大変でした。