我正在使用GNU / Linux发行版,其中实用程序rename
来自util-linux
,我想充分利用它的常规(Perl或POSIX)表达式。
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
工具的特定版本。)
答案 0 :(得分:4)
以下是手册页:http://linux.die.net/man/1/rename。这非常简单:
将从 重命名为文件...
重命名将通过替换第一个来重命名指定的文件 由到的名称中从出现。
我相信没有正则表达式,它只是普通的子串匹配。
答案 1 :(得分:-1)
以下命令提供输入文件的预期结果,但使用perl
版本:
rename 's/foo_\D+(\d+)/foo_$1/' *.ext
您可以使用-n
选项重命名