在zsh
你可以使用zmv
. [我无法直接链接到该man
页面,但它位于man zshcontrib
]。
在使用它之前,您需要autoload -U zmv
使用它来加载它。
它相当强大。要解决您的问题:
zmv -n '([a-zA-Z])(*)' '${(L)1}/${1}${2}'
解释:
zmv -n
:-n
标志的意思是“不要这样做,只要显示如果我没有告诉你不要这样做,你会做什么”。
- 第一部分是我们的匹配模式。我们想要匹配文件名的两个部分,我们在
(..)
其中(每个匹配一个)。[如果我们省略括号,zsh 仍然会匹配,但我们稍后将无法引用该匹配]。如果它是字母,我们匹配第一个字符,以及其他所有字符。
- 后半部分是我们将文件移动到的位置。我们获取第一个匹配的 glob(这是第一个字符):
${<number>}
, (其中<number>
是第一部分中匹配的 glob 的索引)并将其转换为小写 with (L)
。然后我们在文件名中添加一个/
,这将为我们将文件放入一个目录中。最后,我们将文件名写回两部分:未修改的第一个字符,以及其他所有内容${1}${2}
有关更多示例,请查看此处。这个页面有一些更基本的信息。
如果你小心的话,你可以在一行中重命名多个子目录中的数百个文件**
。例如:
zmv -n "(**/)(*). TV-Show-Name-(*)-S(*).avi" '${1}S0${4}E${2} - ${3}.avi'
将重命名当前目录的每个子目录中的每个 avi 文件。最困难的部分是确定正则表达式以匹配您想要的文件。
请使用-n
检查您将要运行的命令是否按照您的想法执行。