次の解決策:
- 3 桁と 4 桁のシーズン + エピソード指定子の両方で動作します (例:
107
シーズン 1 のエピソード 7、または1002
シーズン 10 のエピソード 2)。
- 次のような高度なテクニックを示し
find
ますbash
。
- ファイル名を正規表現で照合する
-regex
プライマリ (のようにワイルドカード パターンではなく-name
)
execdir
一致する各ファイルと同じディレクトリでコマンドを実行する (一致するファイル名 のみが{}
含まれる場所)
- 組み込み変数を介して報告されたグループと
bash
の正規表現マッチングおよびキャプチャーを示すアドホック スクリプトを呼び出す。コマンド置換 ( ) は、値をゼロで左詰めします。部分文字列を抽出するための変数展開 ( )。=~
${BASH_REMATCH[@]}
$(...)
${var:n[:m]}
# The regular expression for matching filenames (without paths) of interest:
# Note that the regex is partitioned into 3 capture groups
# (parenthesized subexpressions) that span the entire filename:
# - everything BEFORE the season+episode specifier
# - the season+episode specifier,
# - everything AFTER.
# The ^ and $ anchors are NOT included, because they're supplied below.
fnameRegex='(.+ - )([0-9]{3,4})( - .+)'
# Find all files of interest in the current directory's subtree (`.`)
# and rename them. Replace `.` with the directory of interest.
# As is, the command will simply ECHO the `mv` (rename) commands.
# To perform the actual renaming, remove the `echo`.
find -E . \
-type f -regex ".+/${fnameRegex}\$" \
-execdir bash -c \
'[[ "{}" =~ ^'"$fnameRegex"'$ ]]; se=$(printf "%04s" "${BASH_REMATCH[2]}");
echo mv -v "{}" "${BASH_REMATCH[1]}S${se:0:2}E${se:2}${BASH_REMATCH[3]}"' \;