テレビ番組のファイル名をS01E01.mp4などに変更して整理します。

テレビ番組のファイル名をS01E01.mp4などに変更して整理します。

名前が正しくないテレビ番組がある場合は、クリーンアップする必要があります。

$ 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

おすすめ記事