在`util-linux`中使用带有`rename`版本的正则表达式

时间:2015-07-14 13:56:58

标签: regex linux bash

我正在使用GNU / Linux发行版,其中实用程序rename来自util-linux,我想充分利用它的常规(Perl或POSIX)表达式。

two versions of rename

  • “Perl”版本,语法为rename 's/^fgh/jkl/' fgh*
  • util-linux版本,语法为rename fgh jkl fgh*

如果第一个使用正则表达式看起来非常明显,我无法轻易访问。但是,我对第二个问题感到困惑:我找不到任何有关可能用途的相关文档或示例,以及在这种情况下要使用的正则表达式的格式。

让我们举一个简单的例子,一个包含:

的目录
foo_a1.ext
foo_a32.ext
foo_c18.ext
foo_h12.ext

我想使用类似以下两行之一的语法:

rename "foo_[a-z]([0-9]{1,2}).ext" "foo_\1.ext" *
rename "foo_[:alpha:]([:digit:]{1,2}).ext" "foo_\1.ext" *

预期输出为:

foo_1.ext
foo_32.ext
foo_18.ext
foo_12.ext

当然这不起作用!要么我缺少一些明显的东西,要么就是 没有实现的方法来使用此工具的实际正则表达式。

(请注意,我知道在shell解释器中使用正则表达式重命名文件的其他可能性;此问题针对rename工具的特定版本。)

2 个答案:

答案 0 :(得分:4)

以下是手册页:http://linux.die.net/man/1/rename。这非常简单:

  

重命名为文件...

     

重命名将通过替换第一个来重命名指定的文件   由的名称中出现。

我相信没有正则表达式,它只是普通的子串匹配。

答案 1 :(得分:-1)

以下命令提供输入文件的预期结果,但使用perl版本:

rename 's/foo_\D+(\d+)/foo_$1/' *.ext

您可以使用-n选项重命名

来测试命令