ToolAct工具行动

文件批量重命名工具

前后缀、序号、查找替换、大小写、扩展名一站搞定,全部在浏览器本地处理

添加文件

拖拽文件到这里,或点击下方按钮

支持任意类型与数量的文件,仅在你的浏览器中处理,不会上传

什么是文件批量重命名?

文件批量重命名是把一组文件按规则一次性改名的操作。常见场景包括:相机导出后的 IMG_1234.JPG 想改成 2026-06-旅行-001.jpg、设计师切图想统一加 @2x_ 前缀、报销单据想按发票日期顺序编号。系统自带的功能各有局限——macOS Finder 支持查找替换和「名称 + 计数器」格式,但不能改扩展名;Windows 资源管理器只支持简单序号(PowerToys PowerRename 支持正则但需另行安装)。复杂场景往往要靠 ReNamer、Bulk Rename Utility 等本地软件,或者自己写 PowerShell / shell 脚本。本工具把这些操作——前后缀、序号、查找替换、大小写、扩展名——拆成可视化选项,配合实时预览和重名检测,一次性确认结果再下载。整个流程都在浏览器内存中完成,含项目代号、客户名称、个人证件名的文件名也不会离开你的电脑。

使用方法

操作步骤

  1. 把要改名的文件拖入上传区,或点击「选择文件」从硬盘选择,多次添加会追加到列表
  2. 如需调整顺序,点列表里的「按名称/按大小」排序,或用每行的上下箭头微调
  3. 在三张配置卡里设置规则:前后缀、查找替换、序号、大小写、扩展名
  4. 右侧「新文件名」会实时变化,蓝色表示与原名不同,红色表示与其他文件重名
  5. 确认无误后点「下载该文件」单个保存,或「打包下载 ZIP」一次拿走全部

规则应用顺序

  • 先用「替换为统一名称」覆盖原名(留空则保留原名),适合「不管原名是什么,全部统一为 photo + 序号」这类场景
  • 然后执行「查找/替换」,仅作用于基础名,不影响扩展名
  • 接着插入序号,可放在最前、最后或完全替换基础名
  • 再加上前缀和后缀,包裹在最外层
  • 最后做大小写转换和扩展名处理,扩展名独立于基础名变换

使用场景

相机/手机导出照片整理DSC_0001.JPG、IMG_1234.JPG 这类相机自带命名缺乏语义,按时间或主题加上前缀和序号能让相册一眼可读。把扩展名转成小写还能避免 JPG 与 jpg 混排——从 Windows/macOS(大小写不敏感)同步到 Linux(大小写敏感)时,混排会直接导致访问失败。
iOS 资产命名规范设计师导出的「icon-home @2x.png」「icon-home @3x.png」可以批量改成「icon-home@2x.png」「icon-home@3x.png」,符合 Xcode Asset Catalog 的命名约定。配合「查找替换」去掉空格,再把基础名转小写,避免大小写敏感问题导致线上加载失败。
Android drawable 资源名规范化Android 要求资源名必须全小写、snake_case、不能以数字开头。导出的 IcHomeActive.png、ic-home-active.png 之类大小写或连字符不规范的名字,可以一次性改成 ic_home_active.png:把 `-` 替换成 `_`,基础名和扩展名都转小写。能在编译报错前提前规范化。
财务单据/合同按月份归档扫描后的 scan001.pdf~scan100.pdf 缺乏归档信息,可设统一基础名「2026-06-报销-」加 3 位序号补零,得到「2026-06-报销-001.pdf」,按文件名排序即按时间排序,配合压缩包打包后整月归档一气呵成。
媒体素材统一命名规则剪辑师常需把多机位素材按场次重新命名,比如 GoPro 的 GH010001.MP4 想改成 SceneA_take01.mp4。先用「替换为统一名称」清掉原名,再启用序号,扩展名转小写,整组素材在 NLE 软件里按字母顺序排列,便于多机位同步。
去除文件名中的敏感词或冗余字符导出的文件经常带 (1)、(副本)、_final_v2_FINAL 之类后缀,用「查找替换」一次清理;含客户/项目代号的文件在外发前可批量替换成代号。所有处理都在浏览器内存中完成,原始文件不上传,敏感命名同样可以放心处理。
网站静态资源规范化上传到 CDN 或对象存储前,把空格、中文、大写字母统一处理,避免 URL 编码踩坑。先「查找替换」把空格换成横杠,再「全小写」,最后扩展名也转小写——一次操作就把一组资源转成 SEO 友好、跨系统安全的命名。

技术原理

整个工具基于浏览器的 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」或「下载该文件」,磁盘上的原文件就不会被改动。预览阶段完全可逆:清空规则、修改规则、移除单个文件都行。即便已经下载了,也只要重新调整规则、用同样的源文件再下载一次即可。