将文件名中除扩展名以外的所有 '.' 替换为 '_'

6

我正在尝试创建一个脚本,将文件名中所有的 "." 替换为 "_". 例如,当我尝试替换所有的 " " 符号时,我使用以下代码:

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

使用逗号进行连接运行正常,但是使用"."符号时,扩展名也会发生改变:

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

如何在不改变文件扩展名的情况下重命名文件(如果有的话)?

当只有一个时,应该应用什么逻辑来确定是否存在一个? - devnull
如果不是指最后一个"."后面的部分,你会如何定义“扩展名”? - fast
@devnull 嗯,举个例子,可以使用file命令来确定文件的MIME类型,然后通过正则表达式比较该类型和最后一个点之后的字符串。 - tversteeg
2个回答

5
您可以使用前瞻来替换最后一个点之前的所有点:
rename 's/\.(?=[^.]*\.)/_/g' '{}'

或者使用负向先行断言:

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

4
那么像.tar.gz这样的文件呢? :) <\troll> (注:该评论中出现的“<\troll>”是一种网络用语,表示在开玩笑或戏谑) - Nippey
1
@ Nippey,好问题,但我不认为OP会考虑到那一点。 - BMW
实际上,你只需要 g 开关,现在已经编辑好了。你可以试试吗? - anubhava
@anubhava 是的,它有效!除了 @Nippey 指出的 .tar.gz,但我现在可以接受这个。谢谢! - tversteeg
1
@anubhava:没错。或者扩展正则表达式以处理这种情况。开玩笑!^^ .tgz 很好! - Nippey
显示剩余2条评论

0

重命名 -n 's/ \.(?=.*\.)//g' * : -n 不会执行任何操作。 要实际进行更改,请去掉-n。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接