【问题标题】:How to uppercase file name but exclude extension如何大写文件名但排除扩展名
【发布时间】:2014-01-04 18:03:14
【问题描述】:

是否可以使用rename 将文件大写但排除其扩展名?

即: 我想将文件 foo_bar.ext 重命名为 FOO_BAR.ext

我尝试使用rename 'y/a-z/A-Z/' foo_bar.ext,但整个文件(包括扩展名)变成大写FOO_BAR.EXT

【问题讨论】:

    标签: linux rename file-rename


    【解决方案1】:

    您要求rename[a-z] 的所有实例转换为[A-Z]。相反,将所需的字符串捕获到一个组中并对其进行修改:

    rename 's/([^.]*)/\U$1/' foo_bar.ext
    

    这会将文件foo_bar.ext 重命名为FOO_BAR.ext


    如果您有一个文件foo_bar.baz.ext 需要重命名为FOO_BAR.BAZ.ext,请使用贪婪匹配和多个组。说:

    rename 's/(.*)(\..*)/\U$1\E$2/' foo_bar.baz.ext
    

    会将文件 foo_bar.baz.ext 重命名为 FOO_BAR.BAZ.ext

    【讨论】:

    • 我很困惑。为什么rename 'y/a-z/A-Z/' foo_bar.ext 不是将文件重命名为大写的一种完全有效的方法?从手册页“要将大写名称转换为小写,您可以使用”rename 'y/A-Z/a-z/' *
    • @BroSlow 因为需要保留扩展的大小写。
    【解决方案2】:

    您可以使用积极的前瞻:

    rename 's/.+(?=\.)/\U$&/g' *
    

    示例

    $ ls
    input.foo.bar.txt
    
    $ rename 's/.+(?=\.)/\U$&/g' *
    $ ls
    INPUT.FOO.BAR.txt
    

    【讨论】:

    • 我不得不添加 -f 可能是因为文件系统不区分大小写
    猜你喜欢
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    相关资源
    最近更新 更多