MMV批量文件重命名

MMV批量文件重命名

我无法确定 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 个字符。因此,我们将匹配它(.)的第一个字符。seasons

  • .*\.匹配上面单个字符之后的所有内容,直到第一个字符.出现为止。正如您所看到的,我们没有将其捕获为匹配组,因为我们想从我们的名称中删除它,其中 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实际执行重命名。

相关内容