ファイル名の一括変換
シェルスクリプト総合@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




