如何实现文件名开头至第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
相关产品推荐
相关产品推荐

