安装包 1.5 MB:我用 Rust 写了个免费跨平台批量重命名工具 NameShift

图片[1]-安装包 1.5 MB:我用 Rust 写了个免费跨平台批量重命名工具 NameShift-聆曦博客

我是一名CG三维动画与特效的从业者,比如每次整理交付素材:

  • 渲染的三维序列,想改个名字规整一下;
  • 活动拍了几百张照片,相机原始文件名全是 DSC_4821.JPG,要改成 20241102-活动名-001 这种规范格式交付;
  • 录课导出的音频是 rec_093015.m4a,48 集要改成 第01集_课程标题.m4a;
  • 也想切图叫 最终版v3_new_final(2).png,成堆的 (1) (2) 括号要去掉、要加前缀、要统一小写。

手动改不用想,肯定怀疑人生。用 Excel 拼公式再复制粘贴?也试过,也是我2018年左右的经常使用方法,光是”复制文件名出来”这一步就已经够烦了。

于是2019年左右我去找现成的工具,然后就遇到了下面这三座大山:

1. 好用的,收费。 几款口碑不错的重命名工具,核心功能锁在付费墙后面,价格还都不便宜。我一年就用几次,为这个买单实在肉疼。

2. 免费的,要么巨丑要么巨大。 界面停留在 XP 时代的先不说;那些界面现代点的,一查安装包——200 多 MB。我就改个文件名,给我装一个浏览器内核?磁盘空间再便宜也不是这么造的。

3. Windows 和 macOS 各要装一款。 我是Windows和Mac都用,就等于要用两套不一样的软件、记两套操作习惯,要是收费软件还得买两份授权。

三座大山加在一起,结论就一句话:没有一个工具,是”免费 + 轻量 + 双平台同一套体验”的。

那都2026年了,刚好自己有一些python和JavaScript基础,这次尝试使用rust作为后端,AI辅助后端的同时,自己写一个不超过10MB的吧。

NameShift 是一款 Windows / macOS 双平台批量重命名工具,一句话概括它的三个”较真”:

  • 免费:供学习与个人使用,永久免费;
  • 轻:Windows安装包 1.5 MB,比一张手机随手拍的照片还小(基于 Tauri 2(vue+rust),不是 Electron(要塞一个浏览器内核,巨大无比));
  • 跨平台:Windows 和 macOS 同一套界面、同一套操作逻辑,改名规则、参数记忆全部一致。

六种重命名模式,覆盖 90% 的日常场景,其实界面灵感来源于绿联NAS的文件管理中批量重命名的方法,咱们这个软件比绿联NAS的功能更多。

图片[4]-安装包 1.5 MB:我用 Rust 写了个免费跨平台批量重命名工具 NameShift-聆曦博客
模式典型用途
查找替换支持正则表达式和 $1 捕获组,(1)(2) 括号一遍清干净
删减内容按位置 / 按范围 / 按关键词 / 按类型删,去掉固定前缀后缀
序号格式{index} {name} 模板,起始编号、步长、位数补零,多目录各自计数
新增内容名称前后、指定位置、关键词前后插入,扩展名永远不被误伤
大小写全大写 / 全小写 / 每词首字母大写
手动编辑预览表里直接逐行改,单行还原、一键全还原

安全这块,我是按”不敢出事”的标准做的

批量改名最怕什么?怕改错,而且改不回来。 所以 NameShift 的核心都围绕这一点:

  • 实时预览:任何参数改动立刻刷新”修改前 → 修改后”,逐行标注可改名 / 未变化 / 冲突 / 非法;
  • 冲突检测:批次内撞名、和目录里现有文件重名,统一忽略大小写(兼容 Windows 和 macOS 的默认文件系统行为);
  • 非法名校验:按当前系统校验非法字符,Windows 保留设备名(CON、NUL、COM1-9…)和尾随点空格也拦;更贴心的是,在 Mac 上改出 Windows 不支持的名字,会给你跨平台可移植性警告——今天交付的文件,明天在同事的 Windows 上打不开,这种坑提前替你踩掉;
  • 两阶段事务执行:名字互换(A↔B)、仅大小写改名这类”传统死结”都能正常执行;任何一步失败自动逆序回滚,目录保证回到初始状态;
  • 一键撤销:会话内可连续撤销最近几次批次。

还有个不起眼但很关键的细节:序号按自然排序分配——第2集 永远排在 第10集 前面,而不是字典序下的 第10集、第2集、第3集…。

所有模式参数、导入选项自动记忆,下次打开接着上次的习惯用。

1. 为什么安装包只有 1.5 MB

用 Tauri 2 而不是 Electron:前端就是系统 WebView(Windows 上是 WebView2),不带浏览器内核,界面层用 Vue 3 + TypeScript,文件操作全部下沉到 Rust。主程序 4.5 MB,安装包 1.5 MB,启动几乎是瞬时的。

2. 前端算预览,Rust 执行改名,职责分死

预览是 core/ 里的纯函数(不依赖 Vue 也不依赖 Tauri),敲键盘零延迟刷新;但 Rust 在真正执行前会用同一套规则二次校验。原则是:前端校验只管体验,不是安全边界——就算前端被绕过,后端也绝不执行危险操作。

3. 两阶段重命名:解开 A↔B 互换这个死结

“把 a.txt 改成 b.txt、b.txt 改成 a.txt”,看起来天经地义,实际上任何时刻直接改都会撞名(目标位被占用)。同理还有”仅大小写改名”(Windows 文件系统大小写不敏感)。

解法是把执行拆成两个阶段:目标位被占用的操作,先挪到同目录下的临时名 ~ns_tmp_<uuid>;全部腾挪完成后,第二阶段统一落到最终名。每一步都记入回滚日志,任一步失败就逆序还原——这本质上是在文件系统上做了一次小型事务。

4. 预览时的”占用名动态扣除”

预览阶段,”本批次即将改走”的名字会从占用集合里扣除,所以互换场景在预览里就能正确显示为”可改名”,而不是误报冲突。

5. 测试兜底

前端 79 个 Vitest 用例覆盖六个规则、文件名拆分、校验与预览编排(含互换、批次撞名等边界);后端 26 个 cargo test 覆盖扫描、执行器、冲突回滚与撤销。批量改名工具,测试覆盖就是良心。

  • 下载地址:以下百度网盘或者GitHub
  • 系统要求:Windows 10/11(64 位);macOS 11+
下载图标
NameShift 安装包
当前版本:
v1.0.0
更新时间:
2026-11-01

技术栈:Tauri 2 + Vue 3 + TypeScript + Rust。

这个工具起源于自己工作中一次次被文件名折磨的瞬间,也是一次认真学习基于Tauri框架桌面应用规范分层的项目。如果你也经常和几百个 DSC_xxxx.JPG 打交道,不妨试试;遇到 bug 或者想要新功能,欢迎来提 issue / 留言。

如果觉得好用,转发给那个还在手动 F2 改文件名的同事吧。

    © 版权声明
    THE END
    喜欢就支持一下吧
    点赞11 分享
    评论 抢沙发

    请登录后发表评论

      暂无评论内容