如何编写这个批量重命名函数的脚本?

如何编写这个批量重命名函数的脚本?

我当前的工作目录中有 4 个文件夹。每个文件夹包含多个按以下格式命名的文件:

HEXA DECA - Season 01 Episode 01 - name of episode
HEXA DECA - Season 01 Episode 02 - name of episode

我想将其重命名为:

HE'XA DECA - S01E01 - name of episode
HE'XA DECA - S01E02 - name of episode

sed对我来说有点太令人畏惧了。实现这一目标的最佳方法是什么?

答案1

我发现这vidir是解决这些问题最灵活和透明的解决方案。在那里,您只需通过任何方式(在 VIM 或其他编辑器中)编辑带有文件名的文本文件,然后更改就会应用。

答案2

就我个人而言,我用于mmv此类任务。其他人使用rename.我的尝试(显然没有经过测试,所以首先尝试使用该-n选项):

for dir in ....; do
    ( cd "$dir"; mmv -r "HEXA DECA - Season ?? Episode ?? - *" "HE'XA DECA - S#1#2E#3#4 - #5" )
done

cd先入$dir而不做mmv "$dir/..."这也是可以的。这是为了避免您的目录可能包含 mmv 的特殊字符,例如?*

答案3

rename命令执行您需要的操作:

find . -type f -exec rename "s/^(.*\/)HEXA DECA - Season ([0-9]*) Episode ([0-9]*) (.*)\$/\$1HE'XA DECA - S\$2E\$3 \$4/" {} \; 

我们需要反斜杠 'cos 单引号中'不能转义,但双引号中我们必须转义$字符。

在这里,我们找到目录和子目录中的所有文件并尝试重命名它们。

s/regexp/smth将把所有regexp匹配替换为smth.

^(.*\/)是路径的第一部分,没有基本名称的所有内容,保存到\$1.

HEXA DECA - SeasonEpisode是不会保存的部分,但它们是用于匹配的模板。

([0-9]*)s 是季数和集数,保存到\$2\$3

(.*)$是字符串的最后一部分,包含剧集名称\$4

在第二部分中,s///我们将\$Ns 替换为我们想要看到的模式。

相关内容