Sublime Text 本身不支持批量改后缀,必须依赖插件或命令行;SideBarEnhancements 需满足项目上下文、重启、启用"enable_batch_rename": true三条件才显示Batch Rename菜单,输入新后缀时只填ts不加点,且需关闭atomic_save以防标签页断连。

Sublime Text 本身不执行任何文件系统操作,所有“批量改后缀”都是调用外部命令;你看到的 Batch Rename 菜单项只是个壳,背后不是 mv 就是 Rename-Item。
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。解决方法很简单:打开 Preferences → Settings,在右侧用户设置中加入:
"atomic_save": false
验证是否生效:重命名后看标签页标题是否立刻变成新文件名;若仍是旧名+星号(*),说明没生效。另外,已打开的旧标签页不会自动刷新内容,需手动关闭再重开,或按 Ctrl+R 刷新侧边栏。
真正麻烦的从来不是改后缀本身,而是改完后代码里所有 require('./x.js') 或 import y from './z.js' 都得同步更新——这一步没人能替你做,Ctrl+Shift+F 全局搜索替换是唯一靠谱方式。

















