1

我有很多要重命名的文件,手动完成它们需要很长时间。它们是视频文件,通常采用这种格式 - “节目名称 - 剧集编号 - 剧集名称”,例如“Breaking Bad - 101 - Pilot”。

我想做的是将“101”部分更改为我自己的“S01E01”约定。我认为在一系列节目中,该字符串的唯一顺序部分是最后一个数字,即。S01E01、S01E02、S01E03、S01E04 等...

谁能给我关于如何在 Mac OS X 上的终端上执行此操作的建议。我相信使用 Automator 或其他批量重命名程序太复杂了...

谢谢

4

4 回答 4

1

以下脚本将查找所有 .mp4 文件,其中包含一串 3 个连续数字。例如 something.111.mp4 。它会将其转换为 something.S01E11.mp4 。它还将排除任何示例文件。

find . ! -name "*sample*" -name '*.[0-9][0-9][0-9].*.mp4' -type f | while read filename; do mv -v "${filename}" "`echo $filename | sed -e 's/[0-9]/S0&E/;s/SS00E/S0/g'`";done;

与之前的脚本一样,它仅在少于 10 个季节时才有效。

对于那些试图为其当前目录树进行个性化的人,我建议学习 sed 和 find 命令。它们非常强大、简单,并且允许您替换文件名中的任何字符串。

于 2014-04-23T03:24:49.527 回答
1

以下解决方案:

  • 适用于 3 位数和 4 位数季节+剧集说明符(例如107第 1 季第 7 集或1002第 10 季第 2 集)
  • 展示先进findbash技术,例如:
    • -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 回答
0

使用perl rename可以轻松处理适当填充并适用于任意数量的季节和剧集的实现(<100,但可以轻松适应您当前的格式):

$ ls -1 *.avi
My Show - 0301 - Qux.avi
My Show - 101 - Foo.avi
My Show - 102 - Bar.avi
My Show - 1102 - Blah.avi
My Show - 201 - Quux.avi

$ rename -n 's/- (\d+)(\d{2,}) -/sprintf("- S%02dE%02d -", $1, $2)/e' *.avi
My Show - 0301 - Qux.avi renamed as My Show - S03E01 - Qux.avi
My Show - 101 - Foo.avi renamed as My Show - S01E01 - Foo.avi
My Show - 102 - Bar.avi renamed as My Show - S01E02 - Bar.avi
My Show - 1102 - Blah.avi renamed as My Show - S11E02 - Blah.avi
My Show - 201 - Quux.avi renamed as My Show - S02E01 - Quux.avi

我认为homebrew附带了正确的版本,所以只需通过安装即可

$ brew install rename
于 2014-04-29T08:19:16.307 回答