最近好几个朋友跑来问我同一类问题:从网上下载的课程文件,每个文件名前面都挂着一长串“某某课堂_”前缀;手机相册导出的照片,全是“IMG_2024xxxx”这种乱七八糟的编号;公司同事发来的设计稿,清一色叫“最终版_需求单_v12_页面1.psd”。手动一个个去重命名,几十个还能忍,几百个文件直接心态爆炸。这个操作在文件整理里太常见了,就是“批量删除文件名前缀”,但很多人不知道到底用什么工具、哪条命令才能又快又不出错。
这篇文章我从实际使用角度出发,把图形化工具和命令行方案都拆开讲清楚。不管你是完全不碰命令行的普通办公用户,还是天天和终端打交道的开发者,都能找到适合自己的做法。我会把每个方案的原理、步骤、参数含义和坑点都写出来,尤其是那些操作失误后想后悔都来不及的细节,比如中文乱码、扩展名被吞、误删前缀导致文件重名,这些我都会专门讲。
1. 批量删除文件名前缀,到底在解决什么问题
1.1 这些场景你可能天天在经历
先说说“前缀”是怎么来的。很多文件名前缀不是你自己起的,而是系统、软件或者来源平台自动加上的。
最常见的一类是下载来源标识。比如从某些资源站下载电子书,文件名会被统一加上“www.example.com_”这样的站点域名;在线课堂导出的视频,经常是“某某教育_第01讲_基础.mp4”,这个“某某教育_”就是待删除的前缀。第二类是拍摄设备自动命名。相机导出的照片通常是“DSC_0001.JPG”或者“IMG_20250101_123456.jpg”,手机截图则是“Screenshot_2025-01-01-123456.png”。如果你想把它们整理成“2025_01_01_XXX.jpg”这种自己的命名规则,IMG_、Screenshot_就是需要去掉的前缀。第三类是协作流程里的临时前缀,比如“待处理_报价单_客户A.xlsx”“新_方案_客户B.pptx”,等流程走完之后,前面这个状态词已经没有意义了,留着反而干扰搜索。
还有一类容易被忽略,就是批量下载工具自动生成的序号前缀,比如“001_红楼梦_第一章.txt”“002_红楼梦_第二章.txt”,这种去掉了还好,但有些场景需要重新排号,就不只是删前缀这么简单了,不过核心思路是一样的:先把不需要的固定文本清洗掉,再统一成自己想要的格式。
这些场景有一个共同点:前缀是统一的、可识别的,而文件名后面的部分才是真正需要保留的内容。如果只有三五份文件,重命名一下无所谓,但一旦数量上到几十、几百,手工操作就是纯纯的浪费时间,而且非常容易出错——手一抖把中间字符给删了,后期找回的成本比重命名本身还高。
1.2 手工改名的痛点和批量操作的底层逻辑
手工改名最大的问题不是慢,而是“一致性”。比如你要删掉“课程_”这个前缀,手工操作时每次选中的字符串长短不一样、光标停留的位置不一样,很容易删多一个字符或者少删一个字符。等你几百个文件全部改完,再回头检查根本没精力一个一个看,最后只能靠运气。
批量操作的核心逻辑其实就一句话:把“找到共同规律,然后统一执行”这件事交给工具去完成。规律是什么?规律就是“文件名开头的某一段固定文本”。无论你用的是图形化工具的“查找替换”,还是命令行里的正则表达式,本质上都是告诉计算机:把每个文件名的开头部分,如果命中某个规则,就把这一段替换成空字符串。
这个思路和很多人在服务器上处理大批量数据时是一样的。比如对一批缓存里的 key 做批量清理,你不可能手动一个个删,而是写一个规则把匹配的 key 全部处理掉。文件名批量重命名也是同一套思维,识别模式、构造规则、小范围验证、最后全量执行。想通了这一层,你就会发现,所谓“批量删除文件名前缀”不是什么高深技巧,它只是一个通用批量处理思想在文件系统中的具体应用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动手之前:先看文件名结构,再定方案
2.1 把文件名拆成“前缀、主体、扩展名”三部分
很多人上来就直接搜工具,结果对着工具界面发懵,根本不知道自己该填什么。其实在动手之前,先花一分钟把文件名结构拆开,后面就顺了。
一个完整文件名可以拆成三块:前缀 + 主体 + 扩展名。比如“课程_第01讲_基础.mp4”,前缀是“课程_”,主体是“第01讲_基础”,扩展名是“.mp4”。我们这次要干的事,是把前缀删掉,主体保留,扩展名绝对不能动。这条原则非常重要。因为很多工具或者命令,如果你不加限制,会把整个文件名(包括扩展名)拿去做替换,一旦你的前缀恰好和扩展名里的字符重合,或者替换逻辑没写好,就会把扩展名也改掉,文件就废了。
还有一种情况要注意,有些文件名根本没有前缀,只是你在批量处理时过滤条件写得太宽,把不该动的文件也卷进来了。比如你只想删掉“report_”开头的文件,但过滤条件写成了所有包含“report”的文件,那么“final_report_2025.xlsx”也会被误伤。所以在动手之前,我强烈建议先把目录里的文件按名称排一下序,肉眼确认一下哪些文件符合条件,数量大概多少。这不是多此一举,这是避免误操作性价比最高的一步。
2.2 图形化工具与命令行的边界在哪里
方案选择上,我一般按两条标准来分:一是文件数量,二是使用频率。
图形化工具,比如 Windows 的 PowerRename、macOS 访达自带的批量重命名,适合几十个文件、偶尔改一次的情况。因为它们有界面、有实时预览,你能在点击确认之前看到每个文件的最终名字,准确性有保障。哪怕你完全不懂技术,也可以靠“在查找框里输入要删除的前缀,替换框留空”这种直观操作完成任务。
命令行方案,比如 PowerShell、bash 脚本,则适合几百上千个文件、或者你需要反复执行同类操作的情况。命令行最大的优势是可以复用:你写好的脚本存下来,下次遇到类似的需求改一个前缀名就能继续用。第二个优势是可以编程化处理更复杂的逻辑,比如多级前缀、动态日期、去重、加序号,这些用图形化工具做会很别扭,但在脚本里只是几行代码的事。第三个优势是便于纳入自动化流程,比如配合定时任务或者文件监控,文件一进来就自动清理前缀,这个想象力就打开了。
反过来讲,命令行方案对新手最大的门槛不是命令本身,而是恐惧感。很多人担心敲错一条命令导致文件全部丢失。这种担心是合理的,所以我后面讲命令行的时候,专门强调了“试运行”和“预览参数”,只要你用对参数,命令不会真的修改任何文件,只是把将要发生的改动打印给你看。说白了,命令行的所谓风险,多数是可以靠习惯规避的。
2.3 选型参考表
我把自己实际用过的方案整理了一张表,覆盖了主流平台,方便你按自己的情况快速定位。
| 环境 | 推荐方案 | 难度 | 适合场景 |
|---|---|---|---|
| Windows | PowerToys PowerRename | 低 | 几十个文件、需要图形化预览 |
| Windows | 批处理脚本(for + ren) | 中 | 固定前缀、批量重复处理 |
| Windows | PowerShell 脚本 | 中高 | 复杂规则、正则、自动化 |
| macOS | 访达“替换文本” | 低 | 快速删除固定前缀 |
| macOS/Linux | bash 参数扩展 | 中 | 固定前缀,纯命令行环境 |
| macOS/Linux | perl rename | 中 | 需要正则的复杂前缀处理 |
表格里的“难度”是我基于普通办公用户上手时间给的参考,不是绝对标准。我的建议很简单:第一次处理,不管你会不会命令行,都先用图形化工具走一遍,看到预览效果再执行。等你理解“原来是这么回事”之后,再琢磨命令行,理解成本会低很多。
3. 图形化方案实操:右键点几下就完成
3.1 Windows 首选 PowerToys 的 PowerRename
Windows 系统本身不带“批量重命名”的右键功能(资源管理器里选中多个文件按 F2 会把它们变成“文件名 (1).txt、文件名 (2).txt”这种带序号的名字,那根本不是删前缀),所以最推荐的免费方案是微软官方出品的 PowerToys 工具集,里面有一个组件叫 PowerRename。
先说安装。去微软官网或者 Microsoft Store 搜索 PowerToys,安装后,在设置里确保 PowerRename 开关是打开的。然后到文件资源管理器里选中所有要处理的文件,右键菜单里就会多出一项“使用 PowerRename 重命名”。
打开 PowerRename 窗口后,你会在顶部看到一个搜索框和一个替换框。要删除前缀,就在搜索框里输入要删掉的文本,比如“课程_”,替换框保持空白。界面中间会实时列出所有选中文件的重命名预览结果,这一条非常关键,它让你在按下“应用”之前就能确认每个文件改完长什么样。
如果你不想让扩展名被误改,记得把界面下部的“包括扩展名”这个选项取消勾选,这样替换逻辑只管文件名主体部分,.mp4、.pdf、.xlsx 这类扩展名原样保留。另外,PowerRename 右上角有一个正则表达式选项,勾选之后搜索框里就可以用 ^ 这个符号来锚定文件名开头,比如搜索框输入 ^课程_ 就表示“只匹配开头的‘课程_’”,中间或者结尾出现的不会被删。这个技巧在你需要精确控制时非常好用。
PowerRename 还有一个足够良心的功能:它会把所有改动记录在 Windows 事件日志里,理论上可以通过事件查看器追溯。但我不建议你把恢复希望寄托在这上面,更靠谱的做法是执行前先复制一份文件到临时目录。
3.2 macOS 访达自带批量重命名
macOS 用户比 Windows 用户幸运一点,因为访达自带批量重命名功能,不需要额外装任何软件。
操作步骤:在访达里选中所有需要处理的文件,右键选择“给 N 个项目重新命名”,弹窗里的下拉菜单有三个选项:“替换文本”“添加文本”“格式”。要删除前缀,选“替换文本”,然后在“查找”输入框里输入要删除的前缀文本,“替换为”输入框留空。比如文件是“课程_第01讲.mp4”“课程_第02讲.mp4”,查找框填“课程_”,替换为空,点击“重命名”,一瞬间所有前缀就没了。
这里要提醒一点:访达的“替换文本”是全局替换,不是在文件开头替换。也就是说,如果文件名中间某处也出现了相同文本,同样会被替换掉。要避免这个问题,只能把查找文本写得更完整,比如“课程_第”而不是“课程_”,这样出现在开头的规则就相对唯一了。如果前缀是一个通用词,中间也可能出现,那建议你用后面讲的命令行正则方案。
另外,macOS 的批量重命名是支持撤销的,改错了马上按 Command + Z 可以回退到上一步。这比很多第三方工具都稳。不过撤销的前提是你没有继续做其他重命名操作,一旦撤销缓冲被占用,就没办法了,所以重要文件还是建议先备份。
3.3 更重的场景:用 Advanced Renamer 管理复杂规则
当你要处理的文件量大、规则又多,比如不仅要删前缀,还要把空格替换成下划线、把日期格式统一、把序号重新归零,这时候 PowerRename 和访达自带的简单替换就有点吃力了。我日常用的一个进阶方案是 Advanced Renamer,它是一款跨平台的批量重命名软件,免费版已经可以满足大部分需求。
Advanced Renamer 的界面左侧是文件列表,中间是“方法”面板,你可以添加多条重命名规则,它会按顺序逐条处理。要删除前缀,可以在方法里选“删除”,设置“从位置 1 到位置 N”的字符区间;也可以用“替换”方法,输入前缀文本然后替换为空。更强大的是它支持正则表达式,比如方法选“正则表达式”,模式填 ^课程_,替换留空,它就能精准只删文件开头的“课程_”。
我自己最喜欢 Advanced Renamer 的一点是“保存方案”功能。一套重命名规则配置好后,可以导出保存,下次遇到类似格式的文件直接加载方案,不用重新配置。对于经常整理特定来源素材的人,这个功能能省下大量时间。它还带撤销功能,执行后如果发现不对,可以批量回滚。
不过要泼一盆冷水:Advanced Renamer 功能越强,误操作的风险也越高。尤其是正则表达式规则,写错一个符号,结果天差地别。我的使用习惯是,不管规则多么简单,第一次跑之前都会把文件列表复制一份到测试目录,在测试目录里执行一遍,确认结果无误后再回真实目录操作。
4. 命令行方案实操:一条规则干完所有活
4.1 Windows 批处理脚本:最轻量的入门写法
先声明,如果你从来没写过批处理,建议直接用 PowerShell 那节的方法,更安全。批处理脚本虽然轻量,但字符串替换的写法比较绕,容易踩坑。
Windows 的 ren 命令本身不支持正则,也不直接支持“删掉某段字符串”这种语义。但我们可以借助 for 循环加变量替换来实现。假设你要删除所有以“课程_”开头的文件的前缀,可以新建一个文本文件,把扩展名改成 .bat,写入下面的内容并保存为 UTF-8 或 ANSI 编码(中文环境一般用 ANSI 更稳):
batch复制@echo off
setlocal enabledelayedexpansion
for %%f in (课程_*) do (
set "old=%%f"
set "new=!old:课程_=!"
if not "!old!"=="!new!" (
ren "!old!" "!new!"
)
)
逐行解释一下。for 循环把当前目录下所有以“课程_”开头的文件和目录都取出来,每次取一个放到 %%f 变量里。set “old=%%f” 保存原始文件名。set “new=!old:课程_=!” 是批处理里的字符串替换语法,含义是把 old 变量里的“课程_”全部替换成空。if 判断是为了防止误操作:如果旧名字和新名字一样,说明这个文件里的“课程_”可能不匹配或者已经被处理过,那就跳过,避免 ren 命令报错。最后用 ren 命令真正改写文件名。
这里要特别提醒:如果替换后的新文件名是空的,或者新文件名和其他文件重名,ren 命令会报错。所以脚本里可以再补一层逻辑,比如重名时自动加一个数字后缀,但考虑到这是入门脚本,我建议你跑之前先确认不会产生重名。
还有一个更简陋但偶尔能用上的方式,是利用 ren 命令的通配符迁移逻辑,比如:
batch复制ren "课程_*" "????*"
它的意思是把“课程_”占掉的位置用问号占位,理论上去掉前三个字符,但实际执行时这个逻辑对中文文件名和扩展名的处理很不可靠,我不推荐你用,写在这里就是为了让你避开网上这种看起来很短、实则容易翻车的“技巧”。
4.2 PowerShell:正则加 -WhatIf 的安全批量处理
如果你在 Windows 上愿意接受一点点学习成本,PowerShell 是我最推荐的命令行方案。它原生支持正则表达式,而且有一个参数叫 -WhatIf,可以在不真正改名的情况下预览执行结果。这个参数能救命,我会在后面的避坑章节里反复提到。
先看最简单的版本。打开 PowerShell,切换到文件所在目录,然后执行:
powershell复制Get-ChildItem -Filter "课程_*" -File |
ForEach-Object {
$newName = $_.Name -replace '^课程_', ''
if ($newName -and $newName -ne $_.Name) {
Rename-Item -LiteralPath $_.FullName -NewName $newName
}
}
这段代码做的事情是:把当前目录下以“课程_”开头的文件取出来,对每个文件名执行正则替换,把开头的“课程_”替换成空字符串,然后调用 Rename-Item 改名。
注意正则里的 ^ 符号,它表示“锚定到字符串开头”。如果你不加 ^,那么文件名中间出现的“课程_”也会被替换,这往往不是你想要的。另外,$.Name 包含扩展名,所以如果有个文件叫“课程_报告.doc”,替换后变成“报告.doc”,这是正确结果。但如果文件主体删光只剩扩展名,比如“课程.doc”,$newName 会是“.doc”,PowerShell 会认为这是一个隐藏文件,处理起来很麻烦。上面代码中的 if ($newName) 就是防止这种情况,至少避免空文件名导致的报错。
更稳妥的写法是拆开主体和扩展名,只对主体做替换:
powershell复制Get-ChildItem -Filter "课程_*" -File |
ForEach-Object {
$newBase = $_.BaseName -replace '^课程_', ''
if ($newBase -and $newBase -ne $_.BaseName) {
$newName = $newBase + $_.Extension
Rename-Item -LiteralPath $_.FullName -NewName $newName
}
}
BaseName 是去掉扩展名后的主体部分,Extension 是包含点号的扩展名。这样替换操作被限制在主体内,扩展名就算以“课程_”开头也不会被误删。
下面是最重要的一步:在真正执行前,先看一眼会改哪些文件。把 Rename-Item 那行加上 -WhatIf 参数,效果就出来了:
powershell复制Get-ChildItem -Filter "课程_*" -File |
ForEach-Object {
$newBase = $_.BaseName -replace '^课程_', ''
if ($newBase -and $newBase -ne $_.BaseName) {
$newName = $newBase + $_.Extension
Rename-Item -LiteralPath $_.FullName -NewName $newName -WhatIf
}
}
加上 -WhatIf 后,PowerShell 只会打印出“如果执行会怎样”的信息,不会真正改动文件。我看到输出结果符合预期之后,再去掉 -WhatIf 执行一遍,整个过程既安全又高效。
4.3 Linux/macOS:用 bash 参数扩展一行搞定
切换到 macOS 或 Linux 终端,你会发现世界一下子清爽了。bash 自带参数扩展功能,${f#前缀} 这个语法可以从变量值开头删除匹配的文本,配合 for 循环一行就能完成批量删前缀。
删除当前目录下所有以“课程_”开头的文件前缀,可以这样写:
bash复制for f in 课程_*; do
[ -f "$f" ] && mv -- "$f" "${f#课程_}"
done
解释一下过程:for f in 课程_* 会把所有以“课程_”开头的文件路径依次赋给变量 f。${f#课程_} 返回删掉“课程_”前缀后的字符串。mv -- “$f” “${f#课程_}” 就是重命名。加 [ -f “$f” ] 是为了跳过目录,只处理文件;-- 是为了防文件名以 - 开头被当成参数。
这个方案的优点是简单、快、不需要安装任何东西。缺点也很明显:它只能删“固定文本”前缀,如果你想删掉的是“前 N 个字符”或者“符合某种模式的前缀”,比如日期前缀“2025-01-01_”,每天日期都不一样,bash 的参数扩展就不太够用了。
这种情况可以用 perl rename。macOS 默认没有这个命令,需要先用 brew install rename 安装,Linux 发行版一般包管理器里都有。安装后可以这样用:
bash复制rename 's/^课程_//' 课程_*.mp4
这个命令的正则语义是:把以“课程_”开头的部分替换为空。其中 ^ 同样是锚定开头。perl rename 的好处是你可以写更复杂的表达式,比如删除“日期_”格式的前缀:
bash复制rename 's/^\d{8}_//' 20250101_*.mp4
这句的意思是把以八个数字加下划线开头的前缀删掉。不管日期怎么变,只要符合“8位数字_”的规则,全部一把梭。这就是正则表达式真正的威力。不过 macOS 的 BSD rename 和 Linux 的 perl rename 语法有区别,如果你在 macOS 上执行没反应,先确认你装的是不是 perl 版本,别在 BSD rename 上硬套正则语法。
5. 常见问题与避坑实录
5.1 中文文件名匹配不上或乱码
这大概是中文用户最容易踩的坑。Windows 里用批处理脚本处理中文文件名时,经常出现“明明文件名里有这个前缀,却匹配不到”或者“改名后变成乱码”。原因基本都是编码问题:cmd 的默认代码页是 GBK(或更老的 ANSI),而 PowerShell、文本编辑器保存脚本时可能用了 UTF-8,两边对不上。
我的建议是:Windows 上处理中文文件名,第一选择是用 PowerShell,它的编码处理比传统 cmd 好很多。如果一定要用批处理脚本,保存 .bat 文件时注意编码,记事本另存为时选“ANSI”,在中文 Windows 下通常能匹配到中文文件名。如果你用的是 Windows 10 以上系统,也可以在命令行先执行 chcp 65001 切换到 UTF-8 代码页,但要注意这会影响整个会话的编码解释。
macOS 和 Linux 的终端默认都是 UTF-8,中文文件名一般没什么问题。但有一种情况需要注意:如果文件名里的中文字符是全角和半角混排,或者包含不可见字符,肉眼看起来一样但程序匹配不上。遇到这种诡异情况,可以用命令先输出文件名的十六进制或者用引号包裹后逐字符检查,不过实战中这种概率很低,真遇到了直接改用图形化工具更省心。
5.2 误删前缀后想恢复怎么办
说实话,文件重命名这个操作没有“回收站”兜底。删除文件还能从回收站恢复,重命名一旦执行,系统不会保存旧名字的历史记录。Windows 的资源管理器没有任何便捷的撤销入口,PowerShell 里做了批量改名也没有自带的 undo。macOS 访达可以按 Command + Z 撤销最近一次批量重命名,但只是最近一次,而且之后再做别的操作就可能失效。
所以我在处理任何批量重命名之前,都会先做三件事。第一件事,在同一个父目录下建一个子目录,比如“_改名备份”,把要处理的文件复制一份进去。注意是复制不是移动。第二件事,在命令行方案里先加 -WhatIf 或者 echo 打印预览,确认规则无误。第三件事,如果文件数量非常多,我还会生成一份“改名清单”保存成文本文件,记录每个文件从旧名到新名的映射。这个清单不用写脚本程序生成,PowerShell 里加一行输出就行:
powershell复制Get-ChildItem -Filter "课程_*" -File |
ForEach-Object {
$newName = $_.BaseName -replace '^课程_', '' + $_.Extension
[PSCustomObject]@{ OldName = $_.Name; NewName = $newName }
} | Export-Csv -Path "rename_log.csv" -NoTypeInformation -Encoding UTF8
以后万一想反悔,照着 CSV 里的映射写一个反向重命名就能恢复。熟练了之后,你会发现这个习惯比依赖撤销功能靠谱一百倍。
5.3 扩展名被吞了,前缀却还在
这种情况多见于用替换逻辑时没有拆开主体和扩展名的处理。比如你用“查找替换”删前缀,查找框输入前缀文本,替换为空,然后不小心勾了“包括扩展名”,这时候如果文件名主体删除后为空,而扩展名又被替换逻辑影响,整个文件名就会变得不可用。
再比如命令行里,直接用 $.Name -replace '^课程','' 处理所有文件时,如果文件主体被删光,剩一个“.mp4”作为新文件名,PowerShell 会把它当隐藏文件处理,导致重命名失败或者文件状态异常。更隐蔽的情况是替换规则不精确,比如前缀是“ab”,但文件名是“abc.txt”,替换后变成“c.txt”,看起来正常,但实际上你原本想删的是“ab_”而不是“ab”,规则写得太宽,把“c”这个主体开头也吞了。
解决办法有两个层面。第一,写规则的时候多看一眼匹配边界。能锚定开头就用 ^ 锚定,能带上完整分隔符就把分隔符带上,比如删“课程_”而不是“课程”。第二,处理逻辑上把主体和扩展名分开,只对 BaseName 做替换,最后再拼上 Extension。图形化工具里则要注意取消勾选“包括扩展名”之类的选项。总之核心原则始终是那句:扩展名是底线,绝对不要让它进入替换范围。
5.4 想要更精确地删除“某段前缀”
有些文件名的前缀不是完全固定的,而是有规律的变动。比如“20250101_报告.xlsx”“20250102_报告.xlsx”,你要删掉“8位日期+下划线”,但是如果用前面那种“删固定文本”的方案,就只能每天改一次日期,那样太傻了。
这种需求最适合用正则表达式。PowerShell 里可以这样写:
powershell复制Get-ChildItem -Filter "*_报告.xlsx" -File |
Where-Object { $_.Name -match '^\d{8}_' } |
ForEach-Object {
$newName = ($_.Name -replace '^\d{8}_', '')
Rename-Item -LiteralPath $_.FullName -NewName $newName -WhatIf
}
Linux/macOS 的 perl rename 版本就是前面提到的:
bash复制rename 's/^\d{8}_//' *_报告.xlsx
这一类需求的关键点不是命令写得多花哨,而是你要先想清楚“规则边界”。日期后面有没有下划线?文件名主体会不会也以数字开头?如果主体部分恰好也符合“数字开头”,正则的 ^ 锚定和贪婪匹配就会产生意外。所以我在写任何一条正则之前,都会先列几个真实的文件名,在脑子里跑一遍匹配过程,确认匹配结果是我想要的。
另外还有一种“删掉前 N 个字符”的固定长度前缀需求。比如文件名清一色是“abcd_xxxx”,你只想删掉前 5 个字符。PowerShell 可以这样:
powershell复制$_.Name.Substring(5)
但它会把扩展名也保留吗?不会,Substring(5) 是从第 6 个字符截取到结尾,扩展名自然包含在内。所以更安全的做法是:
powershell复制$_.BaseName.Substring(5) + $_.Extension
命令行处理文件名时,所有针对“位置”的运算都应该在 BaseName 上进行,避开扩展名,这个习惯一旦养成,出问题的概率会大幅下降。
6. 我自己的一些操作习惯
说了这么多工具和命令,最后分享几个我个人的习惯,希望能帮你在实操中少走弯路。
第一个习惯是无论多熟练,批量重命名的第一次执行一定放在测试目录里。我电脑上常年留着一个名为“_test_rename”的文件夹,专门放测试文件。新写好的脚本先在测试目录里用 5 个文件跑一遍,严格检查输出结果,确认无误后才去真实目录执行。这5秒钟的额外操作,帮我避开了至少十次大型事故。
第二个习惯是会自动给脚本加上“安全锁”。PowerShell 里能加 -WhatIf 的就加,批处理脚本里会先 echo 出将要执行的 ren 命令,Linux 里会用 echo 代替 mv 先打印一遍。所谓安全锁,本质上就是在真正动手之前,让系统先告诉我“你打算干什么”。尤其是在夜深人静或着急忙慌的时候,眼睛一花很容易把目录搞错,把 D 盘的一堆工作文档给改了名,那感觉谁试谁知道。
第三个习惯是用文本文件留下“重命名映射”。如果是几百个文件的大工程,我几乎一定会生成 rename_log 文件。别嫌它多余,文件名就是数据,万一后面要回溯、要给别人交接、要写自动化脚本,这份映射能省太多事。甚至可以把它当备份的一部分存起来,一旦发现某批文件改错了,照着清单写个反向脚本,几下就恢复了。
第四个习惯是处理完之后马上做一轮“随机抽检”。批量命名完成后,我不会只看目录列表的截图,而是随机打开几个文件确认能正常打开,文件内容没有因为改名而损坏。重命名理论上不会动文件内容,但在异常断电、网络驱动器同步、权限不足等情况下,偶尔会出现文件状态异常,抽检就是最后一道保险。
批量删除文件名前缀看起来是一件小事,但把这件事做利索了,你操作文件的思路会顺很多。以后再遇到“批量加后缀”“统一改成大写”“按创建时间重新编号”之类的需求,你会发现它们底层是同一套逻辑:找规律、写规则、先试跑、再执行。这套逻辑不光是文件管理能用,很多工作生活里的重复劳动,都可以拿它来举一反三。
