2014-02-17 53 views
6

我正在尝试创建一个替换所有“。”的脚本。以“_”出现在文件名中。例如,当我尝试更换所有的“”我用这个符号:重命名所有'。'到'_'除扩展名以外的文件名

rename 'y/ /_/' '{}' file 
# test 1.2.jpg -> test_1.2.jpg 

工作正常,但是当我尝试用做“”。符号的扩展名也会发生变化:

rename 'y/./_/' '{}' file 
# test 1.2.jpg -> test 1_2_jpg 

如何在不更改扩展名(有一个扩展名)的情况下重命名文件?

+0

'当有一个'' - 什么逻辑将应用于图_如果有one_? – devnull

+0

如何定义“扩展名”,如果不是最后一个“。”后面的部分.. – fast

+0

@devnull例如,'file'命令可以用来确定MIME类型,然后比较这两者之间的正则表达式最后一点之后的字符串。 – tversteeg

回答

4

您可以使用一个超前的最后一个点之前全部更换点:

rename 's/\.(?=[^.]*\.)/_/g' '{}' 

或使用负前瞻:

rename 's/\.(?![^.]*$)/_/g' '{}' 
+0

它不起作用,文件名'test.1.2.jpg'被转换为'test_1.2.jpg' – tversteeg

+4

那么.tar.gz文件呢? :) <\troll> – Nippey

+1

@ Nippey,好问题,但我不认为OP会想到这一点。 – BMW

0

命名-n“S/\(=?。 * \。)// g'*:-n没有动作。 要实际进行更改,请删除-n。