ファイル名の一括変換

シェルスクリプト総合@LINUX Part5 に以下のような問題があります。

ファイル名の一括変換なんかができたらなぁと思っています。

まいにちフランス語_4月13日放送分.mp3 → FR20090413.mp3
まいにちフランス語_4月14日放送分.mp3 → FR20090414.mp3
まいにちフランス語_4月15日放送分.mp3 → FR20090415.mp3
まいにちフランス語_4月16日放送分.mp3 → FR20090416.mp3
まいにちフランス語_4月17日放送分.mp3 → FR20090417.mp3

というルールでファイル名を一括変換したいのですが、
シェル・スクリプトでどう書けばいいのかさっぱり分かりません。
どなたかお助け願えませんでしょうか?よろしくお願いいたします。

gawk を用いれば split() 関数を使って "_月日" の 3 文字で分割することで簡単に分割することができますが、ここでは nawk でも動作するように match() 関数を用いて作成しています。

#! /usr/bin/gawk -f
# rename_file.awk

BEGIN {
    header = "FR";
    year   = 2009;

    for (i = 1; i < ARGC; i++) {
        org_file = ARGV[i];
        match(ARGV[i], /_/);
        ARGV[i] = substr(ARGV[i], RSTART + RLENGTH);
        match(ARGV[i], /[0-9]+/);
        month = substr(ARGV[i], RSTART, RLENGTH);
        ARGV[i] = substr(ARGV[i], RSTART + RLENGTH);
        match(ARGV[i], /[0-9]+/);
        day = substr(ARGV[i], RSTART, RLENGTH);
        rename_exec = sprintf("mv %s %s%d%02d%02d.mp3", \
                              org_file, header, year, month, day);
        print rename_exec;
        ##system(rename_exec);
    }
}

少しダラダラ感があるのですが、"_", "月", "日" で分けるのではなく、nawk で使えるように数字でマッチさせています。

このスクリプトを実行すると以下のようになります。

$ nawk -f rename_file.awk *.mp3
mv まいにちフランス語_4月13日放送分.mp3 FR20090413.mp3
mv まいにちフランス語_4月14日放送分.mp3 FR20090414.mp3
mv まいにちフランス語_4月15日放送分.mp3 FR20090415.mp3
mv まいにちフランス語_4月16日放送分.mp3 FR20090416.mp3
mv まいにちフランス語_4月17日放送分.mp3 FR20090417.mp3

実際に実行させるには system() 関数の前のコメントを外してください。

gawk で日本語を含む正規表現で split する

filter を用いたファイル名の一括変換 - forest book にも取り上げていただいたきました。 そこで、上に書いている gawk で簡単に処理を行ったものを付け加えておきます。

#! /usr/bin/gawk -f
# rename_file_2.awk

BEGIN {
    sep = "[_月日]";

    for (i = 1; i < ARGC; i++) {
        split(ARGV[i], a_argv, sep);

        exec = sprintf("mv %s FR2009%02d%02d.mp3",
                        ARGV[i], a_argv[2], a_argv[3]);
        print exec;
        ##system(exec);
    }
}

かなり省略している部分もありますが、非常にスッキリしていると思います。 実際に実行してみます。

$ gawk -f rename_file_2.awk *.mp3
mv まいにちフランス語_4月13日放送分.mp3 FR20090413.mp3
mv まいにちフランス語_4月14日放送分.mp3 FR20090414.mp3
mv まいにちフランス語_4月15日放送分.mp3 FR20090415.mp3
mv まいにちフランス語_4月16日放送分.mp3 FR20090416.mp3
mv まいにちフランス語_4月17日放送分.mp3 FR20090417.mp3

実行してみて気がついたのですが、Busybox の awk も上記のような日本語を含む正規表現に対応しているようです。

$ busybox awk -f rename_file_2.awk *.mp3
mv まいにちフランス語_4月13日放送分.mp3 FR20090413.mp3
mv まいにちフランス語_4月14日放送分.mp3 FR20090414.mp3
mv まいにちフランス語_4月15日放送分.mp3 FR20090415.mp3
mv まいにちフランス語_4月16日放送分.mp3 FR20090416.mp3
mv まいにちフランス語_4月17日放送分.mp3 FR20090417.mp3

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png