如何在 Linux 中使用正则表达式捕获组重命名文件?

How to rename a file using regex capture group in Linux?

我想将 a_1.0.tgz 重命名为 b_1.0.tgz,因为 1.0 可以更改为任何版本号,我该如何实现?

比如我不需要保留版本号可以用mv a*.tgz b.tgz

我对 zsh 不太熟悉,所以我不知道它是否支持正则表达式,但我认为您在这里真的不需要它们。

您可以使用 glob 匹配文件并使用替换:

for file in a_[0-9].[0-9].tgz; do 
    echo "$file" "${file/a/b}"
done

在 glob 模式中,[0-9] 匹配 09 之间的任何数字。 ${file/a/b} 将第一次出现的 a 替换为 b

如果您对结果满意,请将 echo 更改为 mv

假设您想用字母 b 替换所有匹配 a*.tgz 的文件中的第一个字符:

for f in a*.tgz; do
  echo mv "$f" "b${f:1}"
done

当您确定这符合您的要求时,请删除 echo

${f:1}使用${name:offset}参数扩展。来自 zshexpn 手册(在 OS X 上):

If offset is non-negative, then if the variable name is a scalar substitute the contents starting offset characters from the first character of the string, [...]

zsh 附带实用程序 zmv,它正是为此而设计的。虽然 zmv 不支持正则表达式,但它确实为文件名生成模式(又名 globbing)提供了捕获组。

首先,您可能需要启用 zmv。这可以通过将以下内容添加到您的 ~/.zshrc:

来完成
autoload -Uz zmv

然后你可以像这样使用它:

zmv 'a_(*)' 'b_'

这将重命名任何匹配 a_* 的文件,因此 a_b_ 替换。如果想不那么笼统,当然可以调整花样:

  • 仅重命名 .tgz 个文件:

    zmv 'a_(*.tgz)' 'b_'
    
  • 仅重命名 .tgz 个文件,同时将扩展名更改为 .tar.gz

    zmv 'a_(*).tgz' 'b_.tar.gz'
    
  • 仅重命名 a_1.0.tgz:

    zmv 'a_(1.0.tgz)' 'b_'
    

为了节省开支,您可以先 运行 zmv 并选择 -n。这只会打印,会发生什么,但实际上不会改变任何东西。有关更多信息,请查看 man zshcontrib.