標準ファイル名称への変換

問題

録画したTSファイルや変換した動画ファイルの名称の形式がバラバラなので統一させたいなぁと思います.

経緯

これまでに作成したバッチでは対処できないファイル名称があちらこちらにありました.変則的なファイル名称があちこちに散在しているという,なんとも浅はかな事態となっています.標準ファイル名称というと大仰ですが,取り敢えず現在は,次のような形式にしたいと思います.

<標準ファイル名称>::=<番組名> <年> <月日><曜日><拡張子><番組名>::=任意文字列<年>::=数字4桁<月日>::=数字4桁 1月15日なら 0115<曜日>::="("[日月火水木金土]")"<拡張子>::=.ts .avi など

対処

動画ファイル名を与えると,標準ファイル名を返すスクリプトを作成.

#! /usr/bin/sh

#
# 動画ファイル名称の標準形を返します.
# 例えば次のようなファイル名を想定しています.
#
# ニュース ファイナル 2010 1014 01.ts
# ニュース ファイナル 2010 1014 2305 02.ts
# ニュース ファイナル 2010 1014 2305.0002.0001.ts
# ニュース ファイナル 2010 1014 2305.0002.ts
# ニュース ファイナル 2010 1014 2305.ts
# ニュース ファイナル 2010 1014(木) 0001.ts
# ニュース ファイナル 2010 1014(木) 001.ts
# ニュース ファイナル 2010 1014(木) 01.ts
# ニュース ファイナル 2010 1014(木) 2305.0002.ts
# ニュース ファイナル 2010 1014(木) 2305.ts
# ニュース ファイナル 2010 1014(木).ts
# ニュース ファイナル 2010 1014.ts
#
# 標準形として,次のようなファイル名を返します.
#
# ニュース ファイナル 2010 1014(木).ts
#

if [[ -z "$1" ]]; then exit; fi

for xp in \
    "^\(.\+\) \([0-9]\{4\}\) \([0-9]\{4\}\) [0-9]\{4\} [0-9]\{2\}\.[^\.]\+$" \
    "^\(.\+\) \([0-9]\{4\}\) \([0-9]\{4\}\) [0-9]\{2\}\.[^\.]\+$" \
    "^\(.\+\) \([0-9]\{4\}\) \([0-9]\{4\}\) \([0-9]\{4\}\.\)\+[^\.]\+$" \
    "^\(.\+\) \([0-9]\{4\}\) \([0-9]\{4\}\)(.).*\.[^\.]\+$" \
    "^\(.\+\) \([0-9]\{4\}\) \([0-9]\{4\}\)\.[^\.]\+$"
do
    title=$(echo "$1"|sed -e "s/""$xp""/\1 \2 \3/")
    if [[ "$title" != "$1" ]]; then
	date_str=$(echo "$1"|sed -e "s/""$xp""/\2\3/")
	weekday=$(date -d $date_str "+%a")
	std_name="$title($weekday).${1##*.}"
	echo "$std_name"
	break
    fi
done

補遺

さっき気づいたけど,これまで擬似BNFで"::=="というように表記してたけど,"::="が正しかったみたいです.恥ずかしい.とはいえ,てきとーなスクリプト公開していること自体恥ずかしいんですけど.たとえば,上記の正規表現とか,もっと整理できそうです.けど,もう触りません.手持ちのファイル群に対しては十分に働いてくれてるようなので.(前日とか,前々日の"::=="は"::="に書き換えました.)
この手のスクリプトはこれで十分かなって思います.一度書き換えが済めば,不要になりますから.今後気が変わって,標準ファイル名称の形式を変えたくなるまで,封印です.でも修正