sublime text原生不支持批量重命名,必须依赖sidebarenhancements插件并满足三条件:项目上下文、启用"enable_batch_rename":true、模板含{{name}}或{{index}}等动态变量,缺一则菜单不显示或操作无效。

Sublime Text 本身不执行任何文件系统操作,所有“批量改后缀”都是调用 mv、ren 或 Rename-Item;你看到的 Batch Rename 菜单项只是个外壳,不是编辑器原生功能。
SideBarEnhancements 的 Batch Rename 为什么没出现
它不是装完插件就自动可用,必须同时满足三个硬条件:
- 通过 Project → Add Folder to Project… 显式添加目录,拖进窗口或双击打开不算“项目上下文”
- 安装插件后重启 Sublime;ST4 某些版本还需手动执行
Package Control: Satisfy Dependencies - 在
Packages/User/SideBarEnhancements.sublime-settings中确认存在"enable_batch_rename": true
缺一个,右键菜单里就只有 Rename(单个),没有 Batch Rename。别猜,直接查设置文件和项目状态。
输入新后缀时填 ts 还是 .ts
填 ts,不是 .ts。插件会自动补点;填 .ts 会导致生成 ..ts,文件名直接损坏。
模板里也不能写死扩展名,比如 {{name}}.ts 看似合理,但若原文件是 utils.js,结果会变成 utils.js.ts——因为 {{name}} 包含原扩展名。正确写法是:{{name|replace:'.js':''}}.ts(需插件支持该过滤器)或更稳妥地用 {{name}}.ts + 手动确保只选 .js 文件。
插件不检查目标文件是否存在:若 utils.ts 已存在,utils.js 重命名会静默失败,无提示、无日志、原文件不动。
PowerShell / Bash 一行命令比插件更可控
当你需要处理嵌套目录、排除某些路径、或加条件逻辑时,插件模板语法立刻失效。命令行才是真批量:
Windows PowerShell(当前目录下所有 .js → .ts):Get-ChildItem *.js | Rename-Item -NewName { $_.Name -replace '\.js$', '.ts' }
macOS/Linux Bash(同上):for f in *.js; do mv "$f" "${f%.js}.ts"; done
关键细节:
- 执行前先运行
Get-ChildItem *.js或ls *.js,确认匹配范围,别在工程根目录盲目跑 -
${f%.js}是 Bash 参数展开,删结尾.js;PowerShell 不支持,必须用-replace或$_.BaseName - 含空格路径必须加引号:
"$f",否则file name.js被拆成两个参数,mv报错
改完后 Sublime 标签页还显示旧名,不是 Bug 是配置问题
这是最常被忽略的同步断裂:磁盘文件名已变,但 Sublime 标签页仍指向旧句柄。
根本原因是默认设置 "atomic_save": true,它让 Sublime 先写临时文件再原子替换,但重命名后旧路径失效,机制失灵。
解决方法:打开 Preferences → Settings,在右侧用户设置中加入:"atomic_save": false
验证是否生效:重命名后看标签页标题是否立刻变成新文件名;若仍是旧名+星号(*),说明未生效。
另外,别忘了全局搜索替换代码中引用——比如把 require('./config.js') 改成 require('./config.ts'),否则编译或运行时会报 Cannot find module。











