【问题标题】:Rename all '.' to '_' in a filename except for the extension重命名所有“。”到文件名中的“_”,扩展名除外
【发布时间】:2014-03-16 12:17:50
【问题描述】:

我正在尝试创建一个替换所有“。”的脚本。出现在带有“_”的文件名中。例如,当我尝试替换所有“”符号时,我使用这个:

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

效果很好,但是当我尝试使用“。”时扩展名的符号也发生了变化:

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

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

【问题讨论】:

  • when there is one -- 以及如果有的逻辑将应用于图?
  • 如果不是最后一个“.”后面的部分,您将如何定义“扩展名”..
  • @devnull 很好,例如file 命令可用于确定 mime 类型,然后将其与最后一点之后的字符串进行正则表达式比较。

标签: regex linux bash rename file-rename


【解决方案1】:

重命名 -n 's/ \.(?=.*\.)//g' * : -n 无动作。 要实际进行更改,请删除 -n。

【讨论】:

    【解决方案2】:

    您可以使用前瞻来替换最后一个点之前的所有点:

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

    或使用负前瞻:

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

    【讨论】:

    • 不行,文件名test.1.2.jpg被转换成test_1.2.jpg
    • 那么像 .tar.gz 这样的文件呢? :)
    • @Nippey,好问题,但我认为 OP 不会想到这一点。
    • 其实你只需要g开关,现在已经编辑好了。可以试试吗?
    • @anubhava:是的。或者扩展正则表达式来处理这样的期望。开玩笑! ^^ .tgz 不错!
    猜你喜欢
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 2016-07-23
    • 2012-03-25
    • 2015-07-22
    • 2013-03-24
    相关资源
    最近更新 更多