我有很多我想要重命名文件,并且它会带我很长的时间来手动完成它们。 他们的视频文件,而且通常这种格式 - “ - 集数 - SHOW名称EPISODE NAME”,因此,例如“绝命毒师 - 101 - 飞行员”。
我想这样做的是改变了“101”的一部分,以我自己的“S01E01”的约定。 我想,在一个系列的演出,这串唯一的顺序部分是最后一个号码,即。 S01E01,S01E02,S01E03,S01E04等..
会有人能够给我如何做这在Mac OS X上终端,我相信它是太复杂使用Automator或其他批量重命名的程序做意见...
谢谢
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位和4位季节+情节说明符(例如作品
107
为季节1,插曲7,或1002
季节10,第2集) - 展示先进的
find
和bash
技术,如: - 所述
-regex
初级由正则表达式匹配的文件名(而不是通配符模式,与-name
) -
execdir
到在同一目录中执行一个命令的每个匹配的文件(其中, {}
只包含匹配的文件名 ) - 调用的ad-hoc
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]}"' \;
下面的脚本会发现所有的.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和找到命令。 他们是非常强大的,很简单,并允许您为文件名中替换任何字符串。
使用perl
rename
执行它可以轻松地照顾适当的填充和适用于任何数量的seaons和发作(<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