名前が正しくないテレビ番組がある場合は、クリーンアップする必要があります。
$ ls
Some_Series.1_Episode.1.mp4 'Some Series01.Episode02.mp4' SomeSeries1Episode03.mp4
一括して名前を次に変更する必要があります。
$ ls
S01E01.mp4 S01E02.mp4 S01E03.mp4
次のスクリプトを使用しましたが、機能しますが、元のファイル名に1 2 3の代わりにシリーズとエピソード番号01 02 03が含まれている場合にのみ機能します。
#!/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
2番目の名前変更ループを実行する前に、パディングが0になるようにファイル名の1 2 3 4 5などを変更するか、0パディングに関係なくすでに01または1を変更する必要があるコードを変更する必要があります。
明らかに見えたらすみません。しかし、私はbashに初めて接する人なので、ご了承ください。
スクリプトを更新しましたが、エピソード8と9に問題が発生しました。次のエラーが発生します
line 10: printf: 08: invalid octal number
したがって、エピソード8と9はありませんが、7つ以上のエピソードを持つ各シリーズには、追加ファイル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テスト実行の全体的な結果を得るために。
ベストアンサー1
printf
、および整数およびゼロパディングのフィールド幅を指定するフォーマット文字列を使用します。
printf -v newname 'S%02dE%02d%s' "$((10#${BASH_REMATCH[2]}))" "$((10#${BASH_REMATCH[3]}))" "${BASH_REMATCH[4]}"
$((10#${BASH_REMATCH[n]}))
小数点計算を強制するには、次を使用します。09
テスト(しかし正規表現を少し修正しました):
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
正規表現を使用する方が強力です。ただ最初の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