node批量重命名必须手写fs+path逻辑,核心是遍历文件、正则处理文件名、拼接路径、调用fs.rename,需预览、dry-run和存在性检查确保安全。

Node 脚本批量重命名必须自己写 fs + path 逻辑
VSCode 本身不提供 Node 环境下的文件批量重命名命令,fs.rename 或 fs.promises.rename 是唯一可控路径——所有“用 Node 批量改名”的方案,本质都是你写一个 rename.js,然后在集成终端(Ctrl+`)里运行 node rename.js。
别指望 require('fs').rename 直接支持通配符或正则;它只接受两个具体路径字符串。你要自己遍历、匹配、构造新名、再调用 rename。
- 必须用
path.join(__dirname, ...)拼路径,硬编码相对路径(如./src/*.js)会失败 -
fs.readdir返回的是文件名列表,不是完整路径,漏掉path.resolve就会跨目录乱改 - 异步操作没加
await或没处理 Promise 链,脚本会提前退出,部分文件没改完 - Windows 下路径分隔符是
,但 Node 的path.join自动适配,别手写dir\file.js
正则重命名的关键:先 match 再 replace,别直接传给 fs.rename
想把 user-api.js → userApi.js,不能靠 fs.rename 自带功能,得手动解析文件名:
诊断并恢复通过 SSH 隧道连接的 OpenClaw 节点。用于解决配对必需错误、隧道冲突、远程端点错误以及 SSH 目标配置错误等问题。
const oldName = 'user-api.js'; const newName = oldName.replace(/-(w)/g, (_, letter) => letter.toUpperCase()); // → 'userApi.js'
注意:这个 replace 是字符串操作,和 fs.rename 完全解耦。你得先对每个 fileName 做这步,再拼出 oldPath 和 newPath。
- 捕获组用
$1还是_.toUpperCase()?推荐后者——String.replace回调更可控,避免RegExp.$1全局状态干扰 - 大小写转换别依赖
U(shell 语法),Node 字符串没有这个,用letter.toUpperCase() - 匹配失败时(比如
index.js不含-),replace返回原字符串,不会报错,但你要确认这是预期行为
安全执行三要素:预览、dry-run、原子性检查
Node 脚本没有内置 dry-run 模式,所有“先看再改”都得你自己实现:
- 第一步:只
console.log(`${oldPath} → ${newPath}`),不调fs.rename,人工确认输出无误 - 第二步:加个开关变量
const DRY_RUN = true,if (!DRY_RUN) await fs.rename(...) - 第三步:检查目标路径是否已存在——
fs.access(newPath, fs.constants.F_OK),避免覆盖或EXISTS报错 - 文件被占用(如
main.js正在node进程里运行)会导致EPERM,Node 不会自动杀进程,得你手动停服务
嵌套目录和特殊字符必须显式处理
默认 fs.readdir 只读当前层,要递归就得自己写或用 glob/fast-glob;空格、中文、括号这些字符在 Node 里不是问题,但拼路径时漏掉引号或没转义就容易出错。
- 用
fs.readdir(path, { withFileTypes: true })区分文件/目录,避免对子目录也执行 rename - 中文路径在 Windows 上一般没问题,但某些旧 Node 版本(
- 别用
child_process.exec(`mv ${old} ${new}`)—— shell 注入风险高,且跨平台失效;坚持纯 Node API - 如果要改后缀(
.ts→.js),用path.parse(fileName).name + '.js',别用fileName.replace('.ts', '.js'),否则test.tsx也会被错改成test.jsx










