文件批量改名(Windows 10 / 11)
安全铁律(最重要,每次都要遵守)
- 先预览,后改名。 不加确认时只出预览清单(现在的名字 → 改成什么),不动任何文件。要真正改名,必须:
① 先不带确认跑一次,拿到带编号的预览;② 把预览念给用户(至少念出改几个、前几个例子、自动处理了哪些冲突、哪些不改);
③ 用户明确说「全部改」「改吧」「只改 1 到 5」这类话之后,才带上--confirm和--pick执行。
用户只说「看看」「嗯」「你看着办」都不算同意,要再问一次。 - 确认时照预览清单改。 执行时不再带文件夹和规则;用户想换规则,就重新预览、再问一次。
- 只改名不挪位置。 新名字永远和原文件在同一个文件夹;后缀名(.jpg .docx)不变;重名自动加 _1、_2,绝不覆盖任何文件。
- 每次都能撤销。 每次改名都写撤销记录;撤销按记录倒着一个个改回原名,改名之后被编辑过、挪走或删掉的文件跳过并说明。
- 黑名单在代码里拒绝,不可绕过: 整个磁盘最外层、Windows 系统目录、Program Files 等软件安装目录(包括同时有 .exe 和 .dll 的文件夹)、ProgramData、AppData、微信/QQ/企业微信的数据目录、网络共享文件夹。OneDrive、百度网盘同步空间等云盘文件夹可以改,但预览里会提醒(改名会同步到云端)。程序组件、数据库、快捷方式、隐藏文件、两分钟内刚改过的文件不改。
- 不联网、不调用任何外部程序、不改注册表、不要管理员权限。 只用 Python 自带功能。
- 数字和名字一律来自脚本输出,不要自己编新名字。
这个技能做什么
脚本:python {baseDir}/scripts/batch_rename.py <子命令>,只用 Python 自带功能。
| 功能 | 子命令 | 会不会动文件 |
|---|---|---|
| 批量改名 | rename 文件夹 规则… |
只出预览,不动 |
| 照预览执行 | rename --confirm --pick all |
用户同意后才改名,写撤销记录 |
| 撤销改名 | undo |
列出记录,不动 |
| 照记录改回 | undo --confirm --pick 1 |
用户同意后才改回原名 |
规则(可以几条一起用,固定按这个顺序算):
去副本 → 替换文字 → 删除文字 → 统一新名字 或 拍摄日期 → 大小写 → 序号 → 前缀/后缀 → 后缀名大小写。
最后统一处理:Windows 不允许的符号(\ / : * ? " < > |)换成 ,结尾的点和空格去掉,CON、NUL 这类保留名加 ,
名字或完整位置太长(超过 260 个字符)就截短,重名加 _1、_2。
- 加前缀/后缀:后缀加在后缀名前面(「合同.pdf」加「_定稿」→「合同_定稿.pdf」)。
- 替换文字:默认普通替换(写什么换什么,点就是点);用户要「把所有【…】去掉」「第12集换成E12」这种模式化替换时才用高级写法(正则),换成里可以用 \1 或 $1。
- 删除文字:删掉一段字,或者删掉几个单独的符号(如 # 【 】)。
- 序号:起始值、位数(3 位就是 001)、每次加几、放前面还是后面、连接符;按名称(「2」排在「10」前面)、修改时间、拍摄时间、大小排,可以倒着排。进子文件夹时每个文件夹各自从头编号。
- 照片按拍摄时间改名:JPG 直接读照片里记录的拍摄时间;苹果 HEIC、视频、PNG、截图、微信传过的照片读不到,用修改时间,预览里会写清楚哪些用了修改时间(修改时间可能是拷贝/下载那天)。同一秒连拍的加 _1。日期样式用 YYYY 年、MM 月、DD 日、hh 时、mm 分、ss 秒拼,默认「20240501_143022」。
- 大小写:英文全小写、全大写、单词首字母大写;后缀名单独变小写(.JPG → .jpg)。
- 去副本:去掉「 (1)」「(2)」「 - 副本」「 - 副本 (3)」「 - Copy」「Copy of」「复件」。原文件还在时会变成「报告_1」——这种多半是重复文件,可以提醒用户。
- 按对照表改名:Excel(.xlsx)或 CSV,A 列现在的名字、B 列新名字,第一行是表头也行。现在的名字可以不写后缀(唯一对得上就行);新名字不写后缀就保留原后缀。对不上的行会列出来。老版 .xls 读不了,请用户「另存为」.xlsx 或 CSV。对照表不能和其它规则同时用。
这个技能不做什么
- 不移动、不复制、不删除任何文件,不改文件内容,不改后缀名本身(只改大小写)。
- 不给文件夹改名,只给文件改名。
- 不进子文件夹,除非用户明确说「连子文件夹一起」。
- 不碰系统目录、软件目录、AppData、聊天软件数据目录、整盘根目录。
- 读不了 HEIC 和视频里的拍摄时间,不猜,用修改时间并说明。
- 不联网,不上传任何文件名。只支持 Windows。
用户说大白话 → 你怎么做
| 用户这样说 | 你先跑(预览) | 然后 |
|---|---|---|
| 「把这个文件夹里的照片按拍摄日期改名」 | rename 位置 --by-date --only-ext jpg,jpeg,heic |
念几个例子;有用修改时间的,告诉用户是哪些、为什么 |
| 「照片改成 2024-05-01 这种名字,后面留原名」 | rename 位置 --by-date --date-format YYYY-MM-DD --keep-name |
同上 |
| 「把这些图片改成 旅行001、旅行002」 | rename 位置 --new-name 旅行 --seq --seq-digits 3 --sep "" --only-ext jpg,png |
问清楚按名字还是按拍摄时间排(--sort shot) |
| 「按拍照先后编号」 | rename 位置 --seq --seq-pos front --sort shot |
— |
| 「每个文件前面加上 2026_」 | rename 位置 --prefix 2026_ |
— |
| 「把文件名里的“初稿”换成“定稿”」 | rename 位置 --replace 初稿 --with 定稿 |
— |
| 「名字里的【高清】【1080P】都去掉」 | rename 位置 --replace "【[^】]*】" --regex |
先说清楚会去掉所有【…】,用户同意再用 |
| 「去掉名字里的空格/#号」 | rename 位置 --remove-chars " #" |
— |
| 「去掉那些 (1)、- 副本」 | rename 位置 --clean-copy |
原文件还在的会变成 _1,提醒用户可能是重复文件 |
| 「后缀 .JPG 改成小写」 | rename 位置 --ext-case lower |
— |
| 「按这张 Excel 名单给文件改名」 | rename 位置 --map 名单位置 |
念对上的和没对上的;没对上的请用户检查表里写法 |
| 「只改名字里带“发票”的」 | 任何规则加 --only-name 发票 |
— |
| 「连子文件夹里的也改」 | 任何规则加 --subfolders |
先确认用户真的要进子文件夹 |
| 「改吧」「全部改」(看过预览后) | rename --confirm --pick all |
念结果:改了几个、哪些没改和原因、怎么撤销 |
| 「只改 1 到 10 号」 | rename --confirm --pick 1-10 |
同上 |
| 「改错了,还原」「撤销刚才的改名」 | undo |
念记录,用户确认是哪一次后 undo --confirm --pick 1 |
位置可以写「桌面」「下载」「图片」「文档」,或者完整的文件夹位置。用户只说「这个文件夹」时,问清楚是哪个。
命令速查(给你看的,不念给用户)
| 参数 | 含义 |
|---|---|
--subfolders |
连子文件夹里的文件一起改(默认不进) |
--only-ext jpg,png / --only-name 字 |
只改这些类型 / 只改名字里带这几个字的 |
--prefix --suffix |
前缀 / 后缀(加在后缀名前面) |
--replace 旧 --with 新 |
替换,可写多对;不写 --with 就是删掉;--regex 高级写法;--ignore-case 不分英文大小写 |
--remove 字 / --remove-chars 符号 |
删掉一段字(可写多次)/ 删掉这些单个符号 |
--clean-copy |
去掉「(1)」「- 副本」 |
--new-name 名字 |
名字统一换成这个(一般配合序号;写 "" 就是只留序号) |
--by-date --date-format --keep-name |
按拍摄时间改名 / 日期样式 / 日期后面留原名 |
--seq --seq-start --seq-digits --seq-step --seq-pos front/end --sep |
序号:起始值(默认 1)/ 位数(默认自动,至少 2 位)/ 每次加几 / 前面还是后面(默认后面)/ 连接符(默认 _) |
--sort name/mtime/shot/size --desc |
序号按名称 / 修改时间 / 拍摄时间 / 大小排;倒着排 |
--case lower/upper/title --ext-case lower/upper |
英文大小写 / 后缀名大小写 |
--map 对照表 |
按 Excel/CSV 对照表改名(不能和其它规则一起用) |
--confirm --pick all 或 --pick 1,3,5-7 |
照最近一次预览执行;撤销时 --pick 1 是最近一次(撤销必须写具体编号) |
--list 清单文件 |
指定清单;不写就用最近一次的(超过 24 小时要求重新预览) |
退出码:0 正常;2 输入或条件有误;3 意外错误。出错时固定两行:「出错了:…」「下一步:…」,原样转告用户。
使用流程
- 听懂用户要改哪个文件夹、想改成什么样,按上表拼规则,先不带确认跑预览。
- 用大白话讲给用户:先一句话(「要改 36 个文件,比如 IMG_0012.JPG 会改成 20240501_143022.jpg」),再说自动处理的冲突、用了修改时间的照片、不改的文件和原因,有云盘提醒要念出来。
- 问用户同不同意;用户想调整(「序号要三位」「日期中间加横杠」)就改规则重新预览。
- 用户明确同意后带
--confirm --pick执行,把结果念给用户:改了几个、哪些没改和原因,告诉他说「撤销改名」就能改回去。 - 用户要撤销:先
undo念记录,再按他说的那一次执行;被动过的文件会跳过,原样转告。
说话方式
- 面向不太会用电脑的人:说「文件名」「后缀名(.jpg 那部分)」「序号」「拍摄时间」「修改时间」,不念命令、参数名、变量名,也不说「正则」,说「按规律批量替换」。
- 不要把完整的个人路径念一遍,说「在图片\2024旅行 里」这样就行。
- 用户紧张(「会不会把文件弄丢」)时,明确告诉他:只改名字,文件内容和位置都不变,不会删任何东西,改完一句话就能全部改回去。
- 预览很长时,念总数和前 5 个例子,再问要不要看全部。
边界
- 改名前文件被打开着(比如 Word 正开着这个文档)会改不了,脚本会跳过并说明;关掉后再预览一次。
- 预览后文件又被改动、改名或删掉的,执行时会跳过;预览超过一天要重新预览。
- 改名之后又被编辑过的文件,撤销时不会动(防止弄乱),会告诉用户自己手动改。
- 同一批文件连续改过几次名,要从最近一次开始一次次往回撤。
- 在云盘同步文件夹里改名会同步到云端和其它设备,分享链接可能失效;撤销也会再同步一次。
- 名字规则来源和细节见
references/windows-filename-rules.md。