web-dev-qa-db-ja.com

テレビシリーズとBashスクリプト

テレビシリーズのシーズンと字幕をダウンロードしました。

.mp4ファイルと.srtファイルの名前が同じである場合、vlcはそれらをビデオに自動的に追加します。

彼らが持っている唯一の共通点はエピソードの数(E01、E02、...)です。

名前を自動的に変更するスクリプトを書きたいのですが、方法がわかりません...

例えば ​​AE01 Video.mp4およびSub E01.srtには.mp4の名前が必要です
なにか提案を?

前もって感謝します!

1
sworwitz

すべてのビデオファイルがパターン*Exx*.mp4に一致し、すべてのサブタイトルファイルが*Exx*.srtに一致すると仮定します。ここで、xxは同じ2桁の10進数です。次のシェルスクリプトを使用して、ファイルの名前を変更できます。 :

#!/bin/bash
shopt -s nullglob

printf '%s\n' *.mp4 |
sed -nre 's/^.*E([0-9]{2}).*$/\1 &/p' |
while read -r episode video; do
  for subtitle in *"E${episode}"*.srt; do
    dst="${video%.*}.${subtitle##*.}"
    if [ "$dst" != "$subtitle" ]; then
      mv -viT -- "$subtitle" "$dst"
    fi
  done
done

名前に同じエピソード番号の字幕ファイルが複数ある場合、または同じ名前のファイルがすでに存在する場合に備えて、インタラクティブウィッチ(-i)をmvコマンドに追加しました。また、idempotentです。つまり、スクリプトを複数回実行しても結果は変わらないため、いつでもスクリプトを中止し、何かを調査して、後で再実行できます。

一時ディレクトリに作成されたいくつかの空のファイルでテストできます。

mkdir /tmp/scratch
cd /tmp/scratch
touch 'AE01 Video.mp4' 'Sub E01.srt'
0
David Foerster