TSファイルをフォルダに振り分ける

問題

地デジTSファイルをHDTVtoMPEG2などで編集すると連番のファイルが複数作成されます.週末などに溜まったTSファイルを整理しようとすると,いくつもの番組名を持つ連番化された多量のTSファイルがフォルダに溢れかえるという事態になります.これを番組毎にフォルダに格納したいのですが,次の一連の手順が必要になります.

  1. 番組名を持つフォルダを作成
    1. ファイル名から新規フォルダ名に相当する部分をコピーして,
    2. 右クリでフォルダの新規作成,
    3. ファイル名をペースト
  2. ファイルを移動
    1. 同一番組ファイルを選択して,
    2. 番組フォルダに移動

という手順になります.飽きます.はっきりいって,ヒトがサル化しないと普通は飽きます.ので,シェルにまかせます.

対処

#! /usr/bin/sh
#
# 連番動画ファイル名称からふさわしいフォルダを作成し,
# ファイルを格納する.
# 例えば,次の5本の動画ファイルに対し,
#
# ニュース ファイナル 2010 1014(木) 2305.0000.ts
# ニュース ファイナル 2010 1014(木) 2305.0001.ts
# ニュース ファイナル 2010 1014(木) 2305.0002.ts
# カルチャー ジャーナル 2010 1014(木) 0129.0000.ts
# カルチャー ジャーナル 2010 1014(木) 0129.0001.ts
#
# 次のような2つのフォルダを作成し,ファイルを各々に格納する.
#
# ニュース ファイナル 2010 1014(木)/
# カルチャー ジャーナル 2010 1014(木)/
#
# <動画ファイル名>::=<番組名><半角空白><年><半角空白><月日><曜日><半角空白><時刻>(.<連番>)+.<拡張子>
# <番組名>::=任意の文字列
# <年>::=数字4桁
# <月日>::=数字4桁
# <曜日>::="("[月火水木金土日]")"
# <時刻>::=数字4桁
# <連番>::=数字4桁
# <拡張子>::= ts とか avi など
# (てきとーなBNFなのでマジマジ見ないでください)

if [[ -z $1 ]]; then
    echo "usage: mkfolder.sh <file extention>"
    exit 1;
fi

ext=$1

for f in *.$ext
do
    if [[ ! -f "$f" ]]; then continue; fi
    folder=$(echo $f|sed -e "s/^\(.* [0-9]\{4\} [0-9]\{4\}(.)\) .*\.${ext}$/\1/")
    if [[ ! -d "$folder" ]]; then
	echo "*** make folder [$folder]"
	mkdir "$folder"
	for g in "$folder"*.${ext}
	do
	    mv "$g" "$folder"
	done
    fi
done

補遺

不都合が起きると何もしないで,メッセージも吐かずに終了します.また,ファイルが1つしかなくてもフォルダを作成してしまうのがちょっと気に入らないのですが,それが私家版.そういう状況って自分に関しては,めったにないのでこれで良いのです.