1

名前を変更したいファイルがたくさんあり、それらを手動で行うには長い時間がかかります。それらはビデオ ファイルで、通常は「番組名 - エピソード番号 - エピソード名」という形式です。たとえば、「ブレイキング バッド - 101 - パイロット」などです。

私がやりたいのは、「101」の部分を「S01E01」の独自の規則に変更することです。ショーのあるシリーズでは、その文字列の唯一の連続部分は最後の数字、つまり. S01E01、S01E02、S01E03、S01E04など...

Mac OS X のターミナルでこれを行う方法について、誰かアドバイスをいただけないでしょうか。

ありがとう

4

4 に答える 4

1

次の解決策:

  • 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]}"' \;
于 2014-04-23T05:16:42.357 に答える
0
for FOO in *; do mv "$FOO" "`echo $FOO | sed 's/\([^-]*\) - \([0-9]\)\([0-9][0-9]\)\(.*\)/\1 - S0\2E\3\4/g'`" ; done

これは、シーズンが 10 未満の場合に機能します。

于 2013-01-12T13:38:12.530 に答える