web-dev-qa-db-ja.com

テレビ番組のファイル名をS01E01.mp4などに名前変更してクリーンアップする

ひどい名前のテレビ番組があり、それらをクリーンアップする必要がある場合

$ 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 を参照してください。

3
s7ntax

整数のフィールド幅とゼロパディングを指定するフォーマット文字列で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
_
3
steeldriver