我有很多想要重命名的文件,手动操作需要很长时间。它们是视频文件,通常采用这种格式 - “显示名称 - 情节号码 - 情节名称”,例如“Breaking Bad - 101 - Pilot”。
我想做的是将“101”部分更改为我自己的“S01E01”惯例。我认为在一个节目的一个系列中,该字符串的唯一连续部分是最后一个数字,即。 S01E01,S01E02,S01E03,S01E04等...
有没有人能够在Mac OS X上给我提供有关如何在终端上执行此操作的建议。我认为使用Automator或其他批量重命名程序太复杂了......
由于
答案 0 :(得分: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命令。它们非常强大,简单,并且允许您替换文件名中的任何字符串。
答案 1 :(得分:1)
以下解决方案:
107
或第10季第2集1002
)find
和bash
技术,例如:
-regex
主要用于通过正则表达式匹配文件名(而不是通配符模式,与-name
一样)execdir
在与每个匹配文件相同的目录中执行命令(其中{}
仅包含匹配文件 name )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]}"' \;
答案 2 :(得分: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个赛季,这是有效的。
答案 3 :(得分:0)
使用perl
rename
实现,可以轻松处理正确的填充,适用于任意数量的海洋和剧集(&lt; 100,但可以很容易地适应您当前的格式):< / p>
$ 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