VSCode原生不支持正则批量重命名文件,所有方案均依赖插件(如File Utilities)或终端命令;插件需启用正则开关且用\1引用捕获组,终端命令则需注意shell差异与预览验证。

VSCode 本身不支持用正则表达式直接批量重命名文件——这是核心限制,所有所谓“正则重命名”都依赖外部工具或插件中转,不是编辑器原生能力。
为什么不能直接用搜索替换改文件名
VSCode 的 Ctrl+Shift+H(全局查找替换)只作用于文件内容,对文件系统中的文件名完全无感知。资源管理器里右键单个文件按 F2 是手动重命名,不接受正则输入,也不支持捕获组引用。
- 试图在搜索面板里输
.*\.js并替换为$1.ts→ 毫无反应,因为那只是文本搜索 - 在资源管理器里 Ctrl+点击多个文件再按
F2→ 只能统一改成同一个名字,无法做规则化映射(比如把user-api.js→userApi.ts) - 语言服务(如 TypeScript 的 Refactor)对文件名零支持,
F2光标停在文件名上无效
File Utilities 插件是唯一靠谱的正则路径
它把正则能力嫁接到文件系统操作上,支持真实捕获组和变量引用,但需注意其语法和 VSCode 编辑器内不完全一致。
- 安装后右键目录 →
File Utilities→Rename Files in Directory - 查找模式写:
(.*)-([a-z])\.js$(匹配api-user.js这类) - 替换模式写:
$1$2.js→ 错误,插件不认$1;必须写成\1\2.js(反向引用,不是$1) - 想转驼峰:
user-api.js→userApi.js,得用两步:先匹配-([a-z]),替换为\U$1(部分版本支持 \U 大写),但稳定性差,建议用脚本 - 插件默认不启用“正则”,要勾选
Use Regular Expression复选框,否则.*当字面量处理
终端命令才是正则重命名的主力方案
VSCode 集成终端(Ctrl+`)调用系统命令,正则能力由 shell 或工具提供,最灵活也最可控。
- macOS/Linux(需
rename命令):rename 's/^(.*)-(\w+)\.js$/$1$2.js/' *.js - macOS/Linux(纯 bash,无 rename):
for f in *-*.js; do [[ $f =~ ^(.*-)([a-z])(.*\.js)$ ]] && mv "$f" "${BASH_REMATCH[1]}${BASH_REMATCH[2]^}${BASH_REMATCH[3]}"; done(注意大小写转换) - Windows PowerShell:
Get-ChildItem *.js | Where-Object Name -match '^(.*)-(\w+)\.js$' | Rename-Item -NewName {$_.Matches[0].Groups[1].Value + $_.Matches[0].Groups[2].Value + '.js'} - 所有命令执行前务必加
echo预览:echo rename ...或echo mv ...,避免误删 - 路径含空格?必须用双引号包裹变量:
"$f",否则命令在空格处截断
容易被忽略的关键细节
正则重命名失败,90% 源于三件事没验证:插件是否真启用了正则开关、终端命令里元字符是否被 shell 提前解析、以及大小写敏感性是否匹配实际文件名。跨平台时,PowerShell 的 -match 和 bash 的 [[ ]] 捕获组编号逻辑不同,$1 在 rename 工具里是 \1,而在 VSCode 编辑器替换里又是 $1——混用必翻车。


















