如何在Linux中使用regex捕获组重命名文件?

时间:2016-07-12 09:07:43

标签: regex zsh

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

例如,如果我不需要保留版本号,我可以使用mv a*.tgz b.tgz

3 个答案:

答案 0 :(得分:3)

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

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

来完成
autoload -Uz zmv

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

zmv 'a_(*)' 'b_$1'

这会重命名与a_*匹配的任何文件,因此a_会被b_取代。如果你想减少一般性,你当然可以调整模式:

  • 仅重命名.tgz个文件:

    zmv 'a_(*.tgz)' 'b_$1'
    
  • 在将扩展程序更改为.tgz

    时仅重命名.tar.gz个文件
    zmv 'a_(*).tgz' 'b_$1.tar.gz'
    
  • 仅重命名a_1.0.tgz

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

要进行保存,您可以先使用zmv选项运行-n。这只会打印,会发生什么,但实际上并没有改变任何东西。有关更多信息,请查看man zshcontrib

答案 1 :(得分:0)

我对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

答案 2 :(得分:0)

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

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

如果您确定这可以执行您想要的操作,请删除echo

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

  

如果offset是非负数,那么如果变量名是a                 标量替换内容起始偏移字符                 从字符串的第一个字符,[...]