我无法确定 mmv 模式。我有一堆具有这种模式的视频文件:
my.program.name.season.NN.episode.NN.-.title.avi
我需要将它们移动到:
my.program.name.sNNeNN.title.avi
我似乎无法获得正确的模式...
答案1
长话短说
rename -n 's/^((\w+\.+){3})(.).*\.(.*)\.(.).*\.(.*)\.\-(\..*)$/$1$3$4$5$6$7/' *
\w+
匹配一个或多个单词字符,即[a-zA-Z0-9_]+
[1]\.+
匹配一个或多个点 (.
) 字符 [2]笔记与角色
\.
相匹配.
。我们需要使用as在正则\.
表达式中具有特殊含义。这被称为转义码,它恢复后面字符的原始字面含义。.
.
\
(\w+\.+){3}
^
匹配从文件名开头(匹配名称开头)开始的上述 [1]、[2] 组字符的任何精度的最多 3 倍。
这将匹配或返回my.program.name.
笔记正则表达式周围的额外括号用于匹配分组。分组匹配开始于
(
并结束于)
并用于提供所谓的反向引用。反向引用包含存储在特殊变量中的匹配子字符串1 美元,2 美元,……,9 美元,其中 $1 包含与第一对括号匹配的子字符串,依此类推。.
元字符点 (.) 匹配任何单个字符。例如...
匹配任意 3 个字符。因此,我们将匹配它(.)
的第一个字符。season
s
.*\.
匹配上面单个字符之后的所有内容,直到第一个字符.
出现为止。正如您所看到的,我们没有将其捕获为匹配组,因为我们想从我们的名称中删除它,其中 this 匹配eason.
。(.*)
匹配上述匹配之后的所有内容。这匹配NN
.这里使用括号是因为我们想将其保留在文件名中。\.
在上述匹配之后匹配一个点。先.
有后有NN
。(.)
再次,我们匹配上述匹配后的第一个单个字符。这只会返回e
..*\.
将匹配上述匹配之后的所有内容,直到第一个.
。会匹配pisode.
。(.*)
匹配上面匹配中最后一个匹配点之后的任何内容。这将匹配第二个NN
。\.\-
匹配一个点.
后跟一个破折号-
。将匹配或返回.-
最后
(\..*)$
匹配一个点.
以及其后到文件名末尾的所有内容。$
匹配文件名或输入字符串的末尾。
注意:删除-n
执行实际重命名的选项。
答案2
你可以使它成为纯粹的 BASH:
netikras@netikras-netbook /tmp $ ls -l /tmp/*.*season.*episode.*avi
-rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.05.episode.07.-.title.avi
-rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.05.episode.32.-.title.avi
-rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.05.episode.35.-.title.avi
-rw-r--r-- 1 netikras netikras 0 Grd 16 10:29 /tmp/my.program.name.season.NN.episode.NN.-.title.avi
netikras@netikras-netbook /tmp $ for i in *.*season.*episode.*avi; do nn="${i/season./s}"; nn=${nn/.episode./e}; nn=${nn/.-./.} ; echo "moving: $i ----> $nn"; mv $i $nn; done
moving: my.program.name.season.05.episode.07.-.title.avi ----> my.program.name.s05e07.title.avi
moving: my.program.name.season.05.episode.32.-.title.avi ----> my.program.name.s05e32.title.avi
moving: my.program.name.season.05.episode.35.-.title.avi ----> my.program.name.s05e35.title.avi
moving: my.program.name.season.NN.episode.NN.-.title.avi ----> my.program.name.sNNeNN.title.avi
这样您就不必调用任何外部应用程序(即 sed/awk)来完成这项工作。 BASH 可以使用内置工具轻松修改字符串。您只需替换文件名的 3 部分并创建一个新文件即可。然后剩下的就是为文件分配新名称。不需要学习任何那些看起来怪异的正则表达式来完成简单的工作。
答案3
尝试使用 perl 执行此操作rename
:
rename -n 's/
(.*?s)eason\.(\d{2})\.episode\.(\d{2})\.-\.(.*\.avi)
/$1$2e$3.$4/x
' my.program.name*
一旦您对这达到了您想要的效果感到满意,请删除 来-n
实际执行重命名。