You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现文件名开头至第1/2个短横线前字母大写(正则/脚本/命令行)

文件名大小写批量修改方案

一、目标匹配的正则表达式拆解

虽然Double Commander的正则替换不支持大小写转换,但先给出匹配目标内容的正则,方便理解定位逻辑:

1. 匹配开头到第一个短横线前的内容

正则匹配式:^([^-]+) -
各部分拆解:

  • ^:锚定文件名的起始位置,确保从开头开始匹配
  • ([^-]+):捕获组,[^-]表示匹配除短横线外的任意字符,+表示至少出现一次,这就是要转大写的前缀
  • -:匹配前缀后面紧跟的空格+短横线,精准定位第一个短横线的位置

2. 匹配开头到第二个短横线前的内容

正则匹配式:^([^-]+ - [^-]+) -
各部分拆解:

  • ^:同样锚定起始位置
  • ([^-]+ - [^-]+):捕获组,包含两段非短横线字符,中间用-连接,对应到第二个短横线前的所有内容
  • -:匹配第二个短横线及其前面的空格,完成定位

二、Double Commander 内用 Lua 脚本实现

Double Commander支持Lua脚本批量重命名,直接用下面的代码就能实现需求:

1. 开头到第一个短横线前转大写

function RenameFunc(file)
    local prefix, rest = string.match(file.name, "^([^-]+)( - .+)")
    if prefix and rest then
        return string.upper(prefix) .. rest
    end
    return file.name
end

使用步骤:打开批量重命名窗口 → 切换到「脚本」模式 → 粘贴代码 → 执行重命名

2. 开头到第二个短横线前转大写

function RenameFunc(file)
    local prefix, rest = string.match(file.name, "^([^-]+ - [^-]+)( - .+)")
    if prefix and rest then
        return string.upper(prefix) .. rest
    end
    return file.name
end

三、Linux 命令行实现方法

1. Bash 脚本批量处理

需求1:开头到第一个短横线前转大写

for file in *.txt; do
    prefix="${file%% - *}"
    rest="${file#* - }"
    mv "$file" "$(echo "$prefix" | tr '[:lower:]' '[:upper:]') - $rest"
done
  • ${file%% - *}:从文件名末尾截断第一个-及之后的内容,提取前缀
  • ${file#* - }:从文件名开头截断第一个-及之前的内容,提取剩余部分
  • tr '[:lower:]' '[:upper:]':把前缀转成大写

需求2:开头到第二个短横线前转大写

for file in *.txt; do
    first_part="${file%% - *}"
    temp="${file#* - }"
    second_part="${temp%% - *}"
    rest="${temp#* - }"
    new_prefix="$first_part - $second_part"
    mv "$file" "$(echo "$new_prefix" | tr '[:lower:]' '[:upper:]') - $rest"
done

2. Perl 命令快速处理

Perl的rename命令支持正则转大小写,非常简洁:

需求1:开头到第一个短横线前转大写

rename 's/^([^-]+)/\U$1/' *.txt
  • \U是Perl的正则标记,作用是把后面的捕获组内容转成大写

需求2:开头到第二个短横线前转大写

rename 's/^([^-]+ - [^-]+)/\U$1/' *.txt

内容的提问来源于stack exchange,提问作者advice2020

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 01:39:56