整理下载目录的时候,大概率会碰上这样的场景:几十上百个文件名乱七八糟,有的带”最终版”,有的带”(1)”,有的是中文和拼音混排。一个个手动改显然不现实,于是很多人第一个想到的办法是——用 Excel 拼一条 ren 命令,复制到命令行里跑。
这个办法我用了很多年,它确实能解决一部分问题,但坑也不少。这篇文章把重命名的常见需求、几种实现路径、以及”先预览再执行”这个安全习惯讲清楚。
一、先看清需求:你在改什么
批量重命名的需求大致分几类:
| 需求 | 例子 | 从 IMG_20260312_1430.jpg 到 |
|---|---|---|
| 加时间戳 | 按拍摄日期统一前缀 | 20260312_IMG_1430.jpg |
| 重排序号 | 课程资料按章节编号 | 01_绪论.pdf、02_基础.pdf |
| 去前缀/去后缀 | 去掉”最终版”、”(1)” | 方案.docx |
| 统一大小写 | 全部转小写,方便脚本处理 | readme.md |
| 替换片段 | 把”tmp”换成”正式” | 会议纪要_正式.docx |
| 改扩展名 | .jpeg 统一成 .jpg |
photo.jpg |
需求本身不复杂,复杂的是改名的规则要能表达”从哪来、到哪去”。一旦规则里出现”保留原名的一部分、再拼接新内容”这种逻辑,纯手工就开始吃力了。
二、Excel 拼 rename:能用,但有几个硬伤
早期我常用的套路是把文件名列拷进 Excel,用公式拼出目标文件名,再用字符串拼接生成命令行:
="ren """ & A1 & """ """ & B1 & """"
或者在 PowerShell 里更干净一点:
="Rename-Item -LiteralPath '" & A1 & "' -NewName '" & B1 & "'"
把整列复制出来,贴进终端执行。这个办法的优点是直观——公式即规则,所见即所得。但用过几次就会碰到这些问题:
一是引号和特殊字符。 文件名里带空格、括号、单引号、& 号的,Excel 拼出来的命令轻则报错,重则把相邻文件一起搞乱。& 在 cmd 里是命令连接符,拼进去直接变成两条命令。
二是冲突检测缺失。 如果目标文件名重复,或者和目录里已有的文件重名,ren 的行为在不同版本的 Windows 里并不一致,有的静默失败,有的直接覆盖。Excel 公式不会帮你检查这件事。
三是没有预览环节。 公式拼对了、命令复制了、回车按下去,改错了才发现。文件名不像代码有版本控制,改错了要一个个回忆原名,或者靠修改时间去猜。
四是 Unicode 问题。 cmd 的 ren 对中文文件名的处理依赖代码页,chcp 65001 之类的招数时灵时不灵,PowerShell 相对好一些但也不是零坑。
所以 Excel 拼命令这条路,适合一次性、规则简单、文件名”干净”的场景。一旦规模上来或者规则变复杂,就应该换思路。
三、正则替换:规则的表达力上一个台阶
真正的分水岭是引入正则。很多改名需求本质上是”匹配模式 + 替换捕获组”,正则天生就是干这个的。
举几个高频例子(PowerShell 写法):
# 去掉末尾的 " (1)"、" (2)" 这类副本后缀
Get-ChildItem -File | Rename-Item -NewName {
$_.Name -replace ' (d+)(?=.)', ''
}
# 把 2026-03-12 这种日期改成 20260312
Get-ChildItem -File | Rename-Item -NewName {
$_.Name -replace '(d{4})-(d{2})-(d{2})', '$1$2$3'
}
# 统一加序号前缀,保持原有扩展名
$i = 0
Get-ChildItem -File | Sort-Object Name | ForEach-Object {
$i++
Rename-Item $_.FullName -NewName ('{0:D2}_{1}' -f $i, $_.Name)
}
正则的难点不在写规则,而在验证规则。-replace 之前,你最好先在只读的输出里看一眼替换结果:
Get-ChildItem -File | ForEach-Object {
'{0} -> {1}' -f $_.Name, ($_.Name -replace ' (d+)(?=.)', '')
}
这一步就是预览。哪怕只是多敲一行 ForEach-Object 输出对比,也能挡下大部分误伤。
规则复杂到一定程度(比如涉及多级目录、需要按文件时间排序、需要跳过特定模式),脚本会越写越长,维护成本开始超过收益。这时候要么把脚本沉淀成可复用的小工具,要么直接用专门的批量重命名软件——我自己在用的 7AA7工具箱里就有批量重命名功能,规则是可视化配置的,关键是它强制先出预览列表、确认后才执行,这个流程设计比”命令行一把梭”要稳得多。
四、先预览再执行:一条不能省的流程
不管用什么工具,批量改名都应该走这个流程:
- 列出候选文件,确认范围没多没少(比如只匹配
.jpg而不是所有文件)。 - 生成对照表:原名 → 新名,逐行看过去。
- 检查冲突:新名是否有重复、是否和已有文件撞车、是否有空名或非法字符。
- 执行,执行时保留一份原名映射表(文本文件即可)。
- 抽查结果,尤其是规则涉及正则贪婪匹配的时候。
第 4 步的映射表是回滚的唯一依据。改名这件事在文件系统层面就是一次元数据操作,没有 undo,唯一的”撤销”就是拿着旧名字改回去。所以映射表要么让工具自动记录,要么自己 Out-File 存下来。
如果改名范围跨了多个目录,或者涉及上万个文件,还应该先在一个小样本上跑一遍规则,确认无误再全量执行。这个习惯和数据库的 UPDATE 先 SELECT 验证 WHERE 条件是一回事。
五、回滚:出错了怎么办
真改错了,按优先级有三条路:
- 有映射表:反向重命名,把新旧列对调再跑一遍。这是最干净的恢复方式。
- 没有映射表,但知道规则:规则可逆的话(比如只是加了前缀),写反向规则跑一遍。
- 两条都没有:按修改时间排序人工核对。文件系统的修改时间在改名时通常不会变,这是最后的线索。
另外提醒一点:改名操作尽量在本地磁盘上做。网络驱动器、云同步盘、以及一些虚拟文件系统对重命名的处理可能有延迟或冲突检测差异,批量操作前最好先同步完成、断开共享再动手。
六、什么时候该工具化
写了几次批量改名脚本之后,我会问自己一个问题:这个规则下次还会用吗?
如果答案是”会”,就值得沉淀。要么做成一个带参数的脚本模板,要么用现成的图形化工具把规则存成配置。工具化最大的收益不是省那几行代码,而是把”预览 → 确认 → 执行 → 记录”这套流程固化下来,让每次操作都不用重新说服自己”这次应该不会出错”。
批量重命名是典型的低频、高危操作:平时想不起来,一旦要做就是一大片。低频意味着肌肉记忆建立不起来,高危意味着出错代价大。对付这类操作,流程比技巧重要。
评论(0)
还没有评论,来抢沙发。
请 登录 后参与评论。