ひどい名前のテレビ番組があり、それらをクリーンアップする必要がある場合
$ ls
Some_Series.1_Episode.1.mp4 'Some Series01.Episode02.mp4' SomeSeries1Episode03.mp4
にするには、それらの名前を一括変更する必要があります
$ ls
S01E01.mp4 S01E02.mp4 S01E03.mp4
私は次のスクリプトを使用しましたが、元のファイル名にシリーズ番号とエピソード番号01 02 03が含まれていて、1 23が含まれていない場合にのみ機能します。
#!/bin/bash
# rename tv show filenames to be Kodi friendly
cd /mnt/2tb_hd/con/
if [ $? == 1 ]; then
exit
fi
for filename in *; do
if [[ "$filename" =~(\**).*(.*[0-9][0-9]).*([0-9][0-9]).*(\....)$ ]]; then
result=$(echo mv \"$filename\" S${BASH_REMATCH[2]}E${BASH_REMATCH[3]}${BASH_REMATCH[4]}\")
if [[ $? == 0 ]] ; then
mv "$filename" "S${BASH_REMATCH[2]}E${BASH_REMATCH[3]}${BASH_REMATCH[4]}"
fi
fi
done
exit
このコードを作成して、ファイル名の1 2 3 4 5などを0パディングに変更してから、2番目の名前変更ループを実行するか、0パディングに関係なく01または1を変更する必要があるコードを変更する必要があります。
これが本当に明白に思える場合は申し訳ありませんが、私はbashを初めて使用するので、ご容赦ください。
スクリプトを更新しましたが、エピソード8と9で問題が発生しました。次のエラーが発生します
line 10: printf: 08: invalid octal number
したがって、エピソード8と9は欠落していますが、7つ以上のエピソードを持つシリーズごとに1つの追加ファイルS02E00.mkvがあります。
適応されたスクリプト
#!/bin/bash
# rename tv show files to Kodi friendly format S01E01 etc
cd /mnt/2tb_hd/Adults/TV_Shows/Breaking\ Bad/
if [ $? == 1 ]; then
exit
fi
reg='^([^0-9]*)([0-9][0-9]*)[^0-9]*([0-9][0-9]*).*(\....)$'
for filename in *.*; do
if [[ $filename =~ $reg ]]; then
printf -v newname 'S%02dE%02d%s' "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}" "${BASH_REMATCH[4]}"
mv "$filename" "$newname"
fi
done
exit
テスト実行の完全な結果については、 http://Pastebin.com/2XRH85ua を参照してください。
整数のフィールド幅とゼロパディングを指定するフォーマット文字列でprintf
を使用します。
_printf -v newname 'S%02dE%02d%s' "$((10#${BASH_REMATCH[2]}))" "$((10#${BASH_REMATCH[3]}))" "${BASH_REMATCH[4]}"
_
_09
_のような場合に10進評価を強制するために$((10#${BASH_REMATCH[n]}))
を使用することに注意してください
テスト(正規表現を少し変更しました):
_reg='^([^0-9]*)([0-9][0-9]*)[^0-9]*([0-9][0-9]*)(\....)$'
for filename in *.mp4; do
if [[ $filename =~ $reg ]]; then
printf -v newname 'S%02dE%02d%s' "$((10#${BASH_REMATCH[2]}))" "$((10#${BASH_REMATCH[3]}))" "${BASH_REMATCH[4]}"
echo mv "$filename" "$newname"
fi
done
mv Some Series01.Episode02.mp4 S01E02.mp4
mv SomeSeries1Episode03.mp4 S01E03.mp4
mv Some_Series.1_Episode.1.mp4 S01E01.mp4
_
おそらくより堅牢なのは、正規表現onlyを使用して最初の2桁のシーケンスを照合し、シェルパラメーター置換を使用して拡張:
_reg='([0-9][0-9]*)[^0-9]*([0-9][0-9]*)'
for filename in *.mp4 *.mkv; do
name="${filename%.*}"
ext="${filename##*.}"
if [[ $name =~ $reg ]]; then
printf -v newname 'S%02dE%02d.%s' "$((10#${BASH_REMATCH[1]}))" "$((10#${BASH_REMATCH[2]}))" "${ext}"
echo mv "$filename" "$newname"
fi
done
mv Some Series01.Episode02.mp4 S01E02.mp4
mv SomeSeries09Episode10.mp4 S09E10.mp4
mv SomeSeries1Episode03.mp4 S01E03.mp4
mv Some_Series.1_Episode.1.mp4 S01E01.mp4
mv Breaking.Bad.S01E01.576p.BluRay.DD5.1.x264-HiSD.mkv S01E01.mkv
_
あるいは、システムにPerlベースのrename
/prename
コマンドがある場合は、次のようにすることができます。
_prename -vn -- 's/.*(\d+).*(\d+)/sprintf "S%02dE%02d.mp4", $1, $2/e' *.mp4
_