文件批量重命名工具
前后缀、序号、查找替换、大小写、扩展名一站搞定,全部在浏览器本地处理
拖拽文件到这里,或点击下方按钮
支持任意类型与数量的文件,仅在你的浏览器中处理,不会上传
什么是文件批量重命名?
文件批量重命名是把一组文件按规则一次性改名的操作。常见场景包括:相机导出后的 IMG_1234.JPG 想改成 2026-06-旅行-001.jpg、设计师切图想统一加 @2x_ 前缀、报销单据想按发票日期顺序编号。系统自带的功能各有局限——macOS Finder 支持查找替换和「名称 + 计数器」格式,但不能改扩展名;Windows 资源管理器只支持简单序号(PowerToys PowerRename 支持正则但需另行安装)。复杂场景往往要靠 ReNamer、Bulk Rename Utility 等本地软件,或者自己写 PowerShell / shell 脚本。本工具把这些操作——前后缀、序号、查找替换、大小写、扩展名——拆成可视化选项,配合实时预览和重名检测,一次性确认结果再下载。整个流程都在浏览器内存中完成,含项目代号、客户名称、个人证件名的文件名也不会离开你的电脑。
使用方法
操作步骤
- 把要改名的文件拖入上传区,或点击「选择文件」从硬盘选择,多次添加会追加到列表
- 如需调整顺序,点列表里的「按名称/按大小」排序,或用每行的上下箭头微调
- 在三张配置卡里设置规则:前后缀、查找替换、序号、大小写、扩展名
- 右侧「新文件名」会实时变化,蓝色表示与原名不同,红色表示与其他文件重名
- 确认无误后点「下载该文件」单个保存,或「打包下载 ZIP」一次拿走全部
规则应用顺序
- 先用「替换为统一名称」覆盖原名(留空则保留原名),适合「不管原名是什么,全部统一为 photo + 序号」这类场景
- 然后执行「查找/替换」,仅作用于基础名,不影响扩展名
- 接着插入序号,可放在最前、最后或完全替换基础名
- 再加上前缀和后缀,包裹在最外层
- 最后做大小写转换和扩展名处理,扩展名独立于基础名变换
使用场景
技术原理
整个工具基于浏览器的 File API、Blob 和 URL.createObjectURL 实现,所有数据流转都在内存中完成。用户拖拽或选择文件后,浏览器把文件以 File 对象(继承自 Blob)保存在 JavaScript 堆中,工具只读取每个文件的 name 属性参与重命名计算,文件二进制内容(content)保持不变。 重命名规则按固定顺序应用,避免规则之间互相干扰:先确定基础名(用户指定或原文件 base),按 lastIndexOf('.') 把扩展名拆出(首字符为 . 的隐藏文件如 .gitignore 不视为扩展名);然后执行字符串 split-join 的查找替换(不使用正则,避免特殊字符意外触发匹配);接着按零索引 index 计算序号 `String(start + i).padStart(pad, '0')`,序号可作前缀、后缀或完全替换基础名;再拼接前缀和后缀;之后对整个「前缀+基础名+后缀」一并做大小写转换;最后独立处理扩展名(保持/大写/小写/替换)。 重名检测用一个 Map<string, number> 在预览时统计每个新文件名的出现次数,超过 1 次的进入 duplicateSet,UI 上以红色标记。此时点击「打包下载 ZIP」会被拦截并弹出错误提示,文件列表保留不动,方便调整规则后重试。这一步在 useMemo 内进行,依赖 [files, opts],规则修改时增量重算,不会因为文件多而卡顿。 单文件下载使用 URL.createObjectURL(file) 生成一次性 blob URL,写入临时 `<a download>` 元素并触发 click,立即 revokeObjectURL 释放。打包下载用 JSZip(动态 import,仅在点击时加载,不影响首屏),把每个 File 的 arrayBuffer() 取出后以新文件名写入 ZIP 节点,最后 generateAsync({type:'blob', compression:'DEFLATE', compressionOptions:{level:6}}) 生成压缩包,DEFLATE 是 ZIP 默认算法,level=6 在压缩比和速度之间平衡。 所有规则计算复杂度是 O(n),n 为文件数;JSZip 的压缩复杂度取决于文件总字节数。主流浏览器对 File 对象通常采用惰性读取——只有调用 arrayBuffer() 时才真正读盘,因此即便加入数千个文件,预览阶段的内存占用也很低,只有点击「打包」时才会出现峰值。
- lastIndexOf('.') 拆分扩展名时,开头是 . 且后面没有更多 . 的文件(如 .gitignore)会被视为整体基础名,避免错把隐藏前缀当扩展名
- 查找替换使用 String.prototype.split + Array.prototype.join 而非 String.prototype.replaceAll,防止用户输入的 $1、$& 等替换字符串里的特殊符号被意外解释
- 序号补零用 padStart(pad, '0');当 pad=0 时直接输出原始数字,方便不需要等宽对齐的场景
- 大小写转换在前缀和后缀拼接完成后才执行,因此会作用于整个「前缀+基础名+后缀」字符串;扩展名独立处理,不受影响
- 重名检测在 useMemo 内基于 Map 计数,时间复杂度 O(n);UI 用 className 切换红色高亮,不重新生成 DOM
- Blob URL 用完立即 URL.revokeObjectURL 释放,避免在频繁下载场景下大量保留的对象 URL 持续占用浏览器内部资源池
- JSZip 通过 dynamic import 按需加载,只有点击「打包下载」才会触发约 80 KB 的代码下载,不影响首屏性能
- DEFLATE level 6 是浏览器端常用的折中值——level 9 仅多 1-2% 压缩率却慢 2-3 倍,对图片/视频/已压缩文件几乎无效
示例
前缀 + 三位序号补零
原文件: photo.jpg, sunset.jpg, beach.jpg
规则: 前缀=trip2026_,序号起始=1,补零=3,位置=后面
结果:
trip2026_photo001.jpg
trip2026_sunset002.jpg
trip2026_beach003.jpg完全替换基础名为序号
原文件: GH010001.MP4, GH010002.MP4, GH010003.MP4
规则: 基础名=SceneA_take,序号起始=1,补零=2,位置=后面,扩展名=改为小写
结果:
SceneA_take01.mp4
SceneA_take02.mp4
SceneA_take03.mp4查找替换清理冗余后缀
原文件: report_v1_FINAL.docx, summary_v1_FINAL.docx
规则: 查找=_v1_FINAL,替换为=(空),大小写=全小写
结果:
report.docx
summary.docx扩展名替换
原文件: index.htm, about.htm, contact.htm
规则: 扩展名=替换为,新扩展名=html
结果:
index.html
about.html
contact.html前缀 + 后缀 + 大小写规范化
原文件: Banner Image.PNG, Hero Photo.JPG
规则: 前缀=web-,查找= ,替换为=-,大小写=全小写,扩展名=改为小写
结果:
web-banner-image.png
web-hero-photo.jpg常见问题
文件会上传到服务器吗?
不会。从添加文件到生成新名再到打包下载,整个流程都在你的浏览器里完成,不存在任何上传请求。你可以打开浏览器开发者工具的 Network 面板验证。
为什么我的扩展名(.gitignore、.bashrc)没有被识别?
工具按「最后一个点之后是扩展名」的规则拆分,但开头就是点(.gitignore)的隐藏文件视为没有扩展名,整个 .gitignore 都当作基础名。这是为了避免错把隐藏前缀当扩展名处理。
新文件名重复了怎么办?
预览列表会用红色高亮重名条目,并显示重名个数。存在重名时点击「打包下载 ZIP」会被拦截并提示错误,文件列表不会丢失,调整规则后重试即可。常见解决办法:启用序号、调整位数补零、加前后缀。
支持文件夹/嵌套结构吗?
暂不支持。当前只重命名单层文件列表。如果需要带目录结构的批量改名,建议先用本工具改名再用「文件打包压缩」工具组装目录。
查找替换是否支持正则表达式?
不支持。当前是纯字符串匹配(split-join),是为了避免用户在替换字符串里误用 $1、$& 等替换符号。简单的字面替换覆盖了绝大多数命名整理场景。
可以处理多少文件?有大小限制吗?
理论上没有数量上限,预览阶段几乎不耗内存。打包阶段受浏览器单个 Blob 内存上限限制:当文件总和达到几个 GB 时,可能因为无法分配整块 Blob 而打包失败,这种情况下建议把文件拆成几批分别打包。
下载的 ZIP 文件名乱码怎么办?
JSZip 默认使用 UTF-8 编码文件名,现代解压工具(macOS Archive Utility、Windows 11、7-Zip、WinRAR 5+)都能正确识别。如果你使用 Windows 自带的旧版资源管理器解压中文名出现乱码,请改用 7-Zip 或 Bandizip。
改错了能撤销吗?
重命名只在下载时才发生——只要你没点「打包下载 ZIP」或「下载该文件」,磁盘上的原文件就不会被改动。预览阶段完全可逆:清空规则、修改规则、移除单个文件都行。即便已经下载了,也只要重新调整规则、用同样的源文件再下载一次即可。