批量图像文件重命名 - 从系统工具到脚本方案

· 9 分钟阅读

何时需要批量图像重命名

批量图像重命名在以下场景中不可或缺:整理相机导出的 IMG_0001.jpg 等无意义文件名、为电商产品图片建立统一命名规范、按拍摄日期重新组织照片库、网站迁移时调整文件名以符合 URL 规范,以及合并来自多个来源的图像时消除命名冲突。

手动重命名在文件数量超过 20 个时就变得不切实际。而且手动操作容易出错 - 拼写错误、序号跳跃、格式不一致等问题会随着文件数量增加而累积。自动化重命名不仅节省时间,还能确保命名的一致性和可预测性。

选择重命名方案时需要考虑:文件数量(几十个还是几千个)、命名规则的复杂度(简单前缀还是基于元数据)、是否需要可逆操作(能否撤销)、以及跨平台兼容性需求。

相机与智能手机拍下的图像会被自动命名为 IMG_0001.jpgDSC_1234.NEF 这类机械式的文件名。典型的批量改名场景包括:拍摄活动后的整理 (把婚礼、旅行、活动的照片按日期或地点分类)、电商网站的商品图像 (统一为商品编号 + 序号,如 PROD-A001_01.jpg)、Web 网站的图像资源 (改为顾及 SEO 的文件名,如 tokyo-tower-night-view.jpg)、多台相机的合并 (按拍摄时间顺序统一编号),以及备份与归档 (以年月日为基础的文件名便于长期保存)。

文件名设计有 4 条基本原则:只使用半角英数字与连字符、下划线 (避免空格与中日文);含日期时采用 YYYY-MM-DD 形式并放在开头 (排序结果自然);序号要留足位数 (用 0001-9999 而不是 001-999);扩展名统一为小写 (.JPG 改为 .jpg)。

使用操作系统内置功能重命名

Windows 和 macOS 都提供了无需安装额外软件的批量重命名功能,适合简单的重命名需求。

Windows 文件资源管理器:选中多个文件后按 F2,输入新名称,系统会自动添加序号后缀(如 photo (1).jpg、photo (2).jpg)。PowerShell 提供更强大的功能:Get-ChildItem *.jpg | Rename-Item -NewName { $_.Name -replace 'IMG_', 'product_' } 可以批量替换文件名中的特定字符串。

macOS Finder:选中多个文件后右键选择"重新命名",提供三种模式 - 替换文本、添加文本、格式化(自定义名称 + 序号)。对于简单的前缀添加或文本替换,Finder 的图形界面足够高效。

这些内置工具的局限性在于:无法使用正则表达式、无法基于文件元数据(如 EXIF 拍摄日期)重命名、无法预览结果、且撤销能力有限。需要更复杂的规则时,应使用命令行工具或脚本。

macOS Finder 的重命名提供 3 种模式:替换文本、添加文本、格式化 (自定义名称 + 序号)。「格式化」模式能生成自定义名称加序号的组合 (如 vacation_001.jpg) 并可指定起始编号,但无法自动插入日期。Windows 资源管理器则是选中多个文件后按 F2 键、输入新名称并回车 (Enter),系统会自动生成「新名称 (1).jpg」「新名称 (2).jpg」这种带括号的序号,用程序再处理时反而不便。

Windows 上还可以使用 Microsoft 官方 PowerToys 中的 PowerRename:它支持正则表达式的查找与替换,并能在预览窗格里先确认结果,例如以 IMG_(\d+)photo_$1 的规则把 IMG_0001.jpg 转换为 photo_0001.jpg

命令行批量重命名

命令行工具提供了灵活且可重复的批量重命名能力。Linux/macOS 的 rename 命令和跨平台的 mmv 是常用选择。

使用 Perl 版 rename(Linux):rename 's/IMG_(\d+)/photo_$1/' *.jpg 将 IMG_0001.jpg 重命名为 photo_0001.jpg。支持完整的 Perl 正则表达式,功能强大。

使用 Bash 循环:for f in *.jpg; do mv "$f" "product_${f#IMG_}"; done。虽然不如 rename 简洁,但在所有 Unix 系统上都可用。

ExifTool 基于元数据重命名:exiftool '-FileName<DateTimeOriginal' -d '%Y%m%d_%H%M%S%%-c.%%e' *.jpg 将文件按拍摄日期时间重命名(如 20260215_143022.jpg)。%%-c 处理同一秒内多张照片的冲突。

安全实践:始终先用 --dry-runecho 预览结果,确认无误后再执行实际重命名。对于不可逆操作,建议先备份或使用版本控制。

rename 命令在 macOS 需经 Homebrew 安装 (brew install rename),多数 Linux 发行版则已标准内置。基本语法是 rename 's/模式/替换/' 文件群:把扩展名统一为小写写作 rename 's/\.JPG$/.jpg/' *.JPG,添加前缀写作 rename 's/^/2026-03-/' *.jpg,把空格换成下划线写作 rename 's/ /_/g' *.jpg;加上 -n 选项即为空跑,只显示结果而不实际改名。

ExifTool 还能把相机机型名一并写进文件名:exiftool '-FileName<${Model}_${DateTimeOriginal}' -d '%Y%m%d_%H%M%S%%-c.%%le' *.jpg,其中 %%le 表示保持原扩展名的小写形式。另一个工具 mmv (Mass Move and Rename) 采用模式匹配,mmv 'IMG_*.jpg' 'photo_#1.jpg' 中的 #1 引用通配符 * 匹配到的那一部分。

使用 Python 脚本进行高级重命名

Python 脚本适合复杂的重命名逻辑,如基于图像内容、多条件组合、或需要与数据库/电子表格配合的场景。

基本模式使用 os.rename()pathlib.Path.rename():遍历目录中的文件,根据规则生成新文件名,执行重命名。pathlib 模块提供了更现代和安全的路径操作方式。

基于 EXIF 数据重命名:使用 Pillow 库读取图像的 EXIF 信息,提取拍摄日期、相机型号等元数据作为文件名的一部分。例如将 DSC_0001.jpg 重命名为 2024-03-15_NikonZ6_001.jpg。

基于图像尺寸分类:读取图像宽高,将横向图片放入 landscape/ 目录,纵向图片放入 portrait/ 目录,同时重命名为统一格式。

冲突处理策略:当目标文件名已存在时,可以自动添加序号后缀、跳过并记录、或抛出错误。推荐先收集所有重命名操作到列表中,检查冲突后再批量执行。

Python 脚本的最小实现只需 import osfrom pathlib import Path:先以 folder = Path("./images") 指定目录,再用 for i, file in enumerate(sorted(folder.glob("*.jpg")), start=1): 按名称排序遍历,循环体内以 new_name = f"photo_{i:04d}.jpg" 生成零填充的序号,最后由 file.rename(folder / new_name) 执行改名。

若要按 EXIF 拍摄时间命名,则加载 from PIL import Imagefrom PIL.ExifTags import TAGSfrom datetime import datetimeimg = Image.open(file) 打开图像后取 exif = img._getexif(),以 if exif and 36867 in exif: 判断 DateTimeOriginal (标签编号 36867) 是否存在;随后 dt = datetime.strptime(exif[36867], "%Y:%m:%d %H:%M:%S") 解析时间字符串,new_name = dt.strftime("%Y%m%d_%H%M%S") + file.suffix.lower() 在生成新名称的同时把扩展名转为小写。

文件名冲突可以交给一个 def get_unique_name(folder, base_name, ext): 函数处理:先取 candidate = folder / f"{base_name}{ext}",令 counter = 1,再用 while candidate.exists(): 循环把候选名改为 candidate = folder / f"{base_name}_{counter:02d}{ext}" 并递增计数,直到不再重复时 return candidate

GUI 重命名工具

图形界面重命名工具适合不熟悉命令行的用户,或需要实时预览重命名结果的场景。

跨平台推荐:Advanced Renamer(Windows)支持多种重命名方法的组合,提供实时预览和撤销功能。Ant Renamer(Windows,免费)界面简洁,支持正则表达式。macOS 上 A Better Finder Rename 是功能最全面的选择。

这些工具的共同优势:实时预览重命名结果(在执行前看到新旧文件名对照)、支持撤销操作、可保存重命名规则模板以便重复使用、支持拖放操作。

选择 GUI 工具的考量:是否支持正则表达式、能否读取 EXIF 元数据、是否提供批处理模板、撤销功能的可靠性、以及对 Unicode 文件名的支持程度。

对于需要定期执行的重命名任务(如每周整理新照片),GUI 工具的模板保存功能比每次手写脚本更高效。但对于一次性的大规模重命名或需要集成到自动化流程中的场景,脚本方案更合适。

各平台的代表性工具:macOS 上的 NameChanger 是免费的简易改名工具,支持查找替换、追加序号与更改扩展名;Windows 上的 Bulk Rename Utility 功能丰富且免费,可把正则表达式、序号、日期、EXIF 信息等 14 种改名操作自由组合,并用批处理列表保存、复用改名计划;跨平台方面,开源照片管理软件 digiKam 内置改名功能,能把 EXIF 信息 (日期时间、相机名、镜头名等) 嵌入文件名,图像浏览器兼管理工具 XnView MP 也搭载了批量改名。挑选时尤其要确认是否提供 Undo (撤销) 功能——误改之后能否一步还原,往往比功能数量更重要。

问题预防与恢复方法

批量重命名操作一旦执行就难以撤销,因此预防措施至关重要。

预防措施:

  • 始终先进行干运行(dry-run)预览结果
  • 在执行前创建文件名映射日志(旧名 → 新名的 CSV 文件)
  • 对重要文件先进行备份
  • 使用版本控制(Git)跟踪文件名变更
  • 避免在原目录直接操作,先复制到临时目录测试

常见问题:

  • 文件名冲突:两个文件重命名后名称相同。解决方案是先检测冲突,使用临时中间名称进行两步重命名
  • 字符编码问题:文件名包含特殊字符或非 ASCII 字符。确保脚本使用 UTF-8 编码处理
  • 大小写敏感性:Windows 文件系统不区分大小写,Photo.jpg 和 photo.jpg 会冲突
  • 路径长度限制:Windows 默认最大路径 260 字符,重命名后可能超出限制

恢复方法:如果保存了重命名映射日志,可以编写反向脚本将文件名恢复。没有日志时,可以尝试从文件的 EXIF 数据或文件系统的修改时间推断原始信息。

执行前的 4 项预防措施:先备份,例如用 cp -r images/ images_backup/ 复制出 images_backup/;再做空跑预览,ExifTool 不加 -execute 即为确认模式,rename 则用 -n 选项;接着只拿几张副本做小样本测试,确认无误后再应用到全部文件;同时明确指定 sorted() 的排序键,避免序号因排序规则不同而错位。

还原手段按可用性排序:留有改名日志 (CSV) 时用脚本做逆向转换;纳入 Git 管理时执行 git checkout -- . 即可回到原状;有备份时从备份恢复;三者皆无时只能依据 EXIF 的拍摄时间推测原文件名,完全还原相当困难。日志的记录方式并不复杂——import csv 之后以 log = [] 准备列表,用 for old, new in renames: 遍历并以 log.append({"old": old, "new": new}) 累积对应关系,最后 with open("rename_log.csv", "w") as f: 打开文件,由 writer = csv.DictWriter(f, fieldnames=["old", "new"])writer.writeheader()writer.writerows(log) 写出。

相关文章

批量图像处理工作流 - 高效批处理的设计与实现

学习如何设计高效的工作流来批量处理数百到数千张图像,包含实用的命令行工具和脚本示例。

图像元数据详解 - EXIF、IPTC 和 XMP 完全指南

了解嵌入图像文件中的 EXIF、IPTC 和 XMP 元数据标准的结构、用途和区别。

EXIF 数据与隐私风险 - 如何防止位置信息泄露

了解照片中嵌入的 EXIF 元数据及其隐私风险。理解 GPS 位置泄露案例,学习如何通过删除 EXIF 数据安全地分享照片。

照片工作流自动化 - 用脚本批量处理数千张图像

照片批量处理自动化完全指南。涵盖 ImageMagick、sharp(Node.js)、ExifTool 的实用技巧及 CI/CD 集成方案。

Retina 显示屏图像制作 - 在高 DPI 屏幕上实现清晰显示

高 DPI 屏幕图像优化完全指南。涵盖设备像素比、srcset 实现、CSS 高 DPI 支持及多分辨率图像生成工作流。

图像篡改检测 - 取证分析技术及其局限性

系统讲解图像篡改检测的取证分析技术。涵盖 ELA、元数据分析、克隆检测、深度学习方法及各技术的局限性。

相关术语