跳到主要内容
返回技巧专栏

用 WorkBuddy 批量重命名 + 格式转换

入门批量重命名文件整理大小写转换

我遇到的具体问题

上月底客户一次性甩给我 137 个导出文件,命名完全看心情:Q3 Report FINAL.xlsxq3_report_final (2).xlsx2024年报表(终).xlsx,还有一堆 IMG_1024.jpgimg_1024.JPG 这种大小写不一致的照片。我要把它们导进公司的资产系统,那套系统要求文件名全是小写、用中划线分隔、不能含空格和中文。我手动改了前 20 个就崩溃了——光是对着文件名改大小写、删空格就花了我快一小时,而且改到后面开始串行,把两个同名不同内容的文件覆盖掉了,又得重来。

为什么这事值得自动化

我算过:137 个文件,手动逐个重命名平均 8 秒,光改名就接近 20 分钟,还没算核对和返工。我们组每个月至少要接两批这种「野文件名」,算上出错重来的时间,一个月在这上面耗掉一个多小时是常态。而且这类活最磨人的是它不创造价值,纯粹是体力活,越做越烦、越烦越容易出错。把它交给 WorkBuddy 跑一遍,我只需要确认规则对不对。

我是怎么用 WorkBuddy 做的

我直接把规则丢给 WorkBuddy:「把这 137 个文件重命名成小写、中划线分隔、去掉空格和中文,同名冲突就加序号」。它先给我列了个预览表,我扫了一眼发现它打算把 2024年报表(终).xlsx 直接变成空名——中文被「去掉」后啥都不剩了。于是我改成规则:中文文件名先用拼音或英文释义替换,实在没法翻的,用 Base64 编解码 把原文件名编成一个安全 token 当唯一后缀,保证不丢、不撞。

统一大小写那步,我先用 大小写转换 试了两种风格——它实时显示「kebab-case」和「snake_case」的预览,我看了一眼资产系统的示例,确认人家要的是中划线,才让 WorkBuddy 按 kebab 跑。规则定准了,它一次性生成了重命名脚本,我在测试目录跑通后才动真文件。

中间卡在哪 & 怎么绕过去

第一个坑是空格。WorkBuddy 第一版脚本里循环写的是 for f in *.xlsx; do mv $f ${f,,}; done,没给变量加引号。IMG_1024 copy.jpg 这种带空格的文件名被 shell 拆成了 IMG_1024copy.jpg 两段,mv 直接报 mv: target 'copy.jpg' is not a directory,整批卡死。排查时我 bash -x 打开调试,看到它把文件名拆开了才反应过来。改成 for f in *.xlsx; do mv "$f" "${f,,}"; done 加双引号,再换成 find . -maxdepth 1 -name '*.xlsx' -print0 | while IFS= read -r -d '' f; do ...,带空格和换行都稳了。

第二个坑更隐蔽:下游那个资产系统的 Node 脚本会用 decodeURIComponent(encodeURIComponent(name)) 校验文件名合法性,遇到 2024年报表(终).xlsx 里的全角括号 () 直接抛 URIError: URI malformed,整个导入挂掉。这不是 WorkBuddy 的锅,是它没料到全角字符。解决办法就是前面说的——先把这类文件名丢进 Base64 编解码 编成 base64:5bCP5py6... 形式当 key,原中文名存进单独的映射表,导入时按 key 取回,绕开了 URI 校验。

顺带的几个发现

跑完才发现几个意外收获。一是 大小写转换 的预览让我顺便统一了照片命名——之前 IMG_1024.JPGimg_1024.jpg 被系统当成两个文件,去重后才发现是同一张图导了两次,省了点存储。二是 Base64 token 这套映射表后来被我复用到了另一批合同文件上,全角文件名全靠它兜底,再没炸过。三是 WorkBuddy 生成的脚本我存成了 rename-assets.sh,下次同类型的活直接改两个变量就能跑,已经成了我的固定家什。

你也可以这样用

给你一个能直接抄的变体:如果你常从网上下载资料,文件名带空格、中文、各种符号,先定一条规则(比如「全小写 + 中划线 + 去非 ASCII」,非 ASCII 的部分用 Base64 编解码 编码兜底),让 WorkBuddy 生成脚本后,务必先在几个样本文件上试跑,确认 mv 都成功、没覆盖、没报错,再对整批动手。顺序是:先小批验证,再全量执行。

常见问题

WorkBuddy 生成的重命名脚本会直接动我原文件吗? 默认它给的是脚本,你可以要求它「先在副本/测试目录跑」,确认无误再对原目录执行,避免误覆盖。

带空格的文件名为什么总报错? 多半是 shell 循环里变量没加双引号,被按空格拆成了多个参数。给文件名变量都加上 "$f" 引号就能解决。

中文/全角括号文件名下游系统读不了怎么办? 别硬删,用 Base64 编解码 把原文件名编成安全 token,原中文另存映射表,下游按 token 取回即可。

大小写转换工具能直接帮我批量改文件吗? 它负责把「目标命名风格」预览清楚(kebab 还是 snake),真正批量改文件名还是交给 WorkBuddy 生成的脚本去跑。

这篇用到的在线工具