2026-10-02 · 喵窝资源铺
从相机、微信、截图里攒下来的文件,名字基本没法看:IMG_20260918_102233.jpg、Screenshot 2026-09-12 at 14.23.11.png、WeChat_2026-09-22_112233.mp4……想按日期归档,右键重命名几百次会把手点废。Windows 右键"批量重命名"只会得到"照片(1).jpg",日期信息全丢。
这篇给一个 30 行、可直接运行 的批量改名脚本,把乱名统一改成 日期_类型_序号。本文代码实跑验证,输出如下文所示。
img / screenshot / wechat,一眼看出出处保存为 rename.py,在照片文件夹里运行 python rename.py 即可。只改名、不动内容,目标名已存在会跳过:
"""批量改文件名:把相机/微信/截图的乱文件名改成「日期_类型_序号」。
用法:python rename.py [目录]
默认当前目录,只改名不动内容,目标名已存在自动跳过。
"""
import sys, re
from pathlib import Path
# (匹配正则, 日期处理函数, 新名前缀)
RULES = [
(r"^IMG_(\d{4})(\d{2})(\d{2})_\d+", lambda m: f"{m.group(1)}-{m.group(2)}-{m.group(3)}", "img"),
(r"^Screenshot (\d{4})-(\d{2})-(\d{2})", lambda m: f"{m.group(1)}-{m.group(2)}-{m.group(3)}", "screenshot"),
(r"^WeChat_\d{4}-(\d{2})-(\d{2})_\d+", lambda m: "2026-" + "-".join(m.groups()), "wechat"),
]
def main(folder=".", prefix_default="file"):
root = Path(folder)
counters = {}
for p in sorted(root.iterdir()):
if not p.is_file():
continue
ext = p.suffix.lower()
for pat, to_date, prefix in RULES:
m = re.match(pat, p.name)
if m:
date = to_date(m)
counters[date] = counters.get(date, 0) + 1
target = root / f"{date}_{prefix}_{counters[date]:02d}{ext}"
if target.exists():
print(f"跳过(已存在): {p.name}")
break
p.rename(target)
print(f"{p.name} → {target.name}")
break
else:
print(f"未匹配(不动): {p.name}")
if __name__ == "__main__":
main(*sys.argv[1:])
13 个乱名文件(4 类来源混合),跑一次:
IMG_20260918_102233.jpg → 2026-09-18_img_01.jpg IMG_20260918_102234.jpg → 2026-09-18_img_02.jpg IMG_20260923_160000.jpg → 2026-09-23_img_01.jpg IMG_20260923_160001.jpg → 2026-09-23_img_02.jpg IMG_20260923_160002.jpg → 2026-09-23_img_03.jpg Screenshot 2026-09-12 at 14.23.11.png → 2026-09-12_screenshot_01.png Screenshot 2026-09-12 at 14.40.03.png → 2026-09-12_screenshot_02.png WeChat_2026-09-22_112233.mp4 → 2026-09-22_wechat_01.mp4 WeChat_2026-09-22_145501.mp4 → 2026-09-22_wechat_02.mp4 ...(共 13 个全部改名成功,0 个遗漏)
紧接着重跑了一次验证幂等性,输出全是:
未匹配(不动): 2026-09-12_screenshot_01.png 未匹配(不动): 2026-09-22_wechat_01.mp4 ...(13 个全部跳过,无一被二次改名)
\w+ 之类宽松正则吃日期:我第一版就翻车了——日期组把扩展名 .jpg 也匹配进去,产出 2026-09-12_.png_01.png 这种鬼东西。用 \d{4}(\d{2})(\d{2}) 精确到数字位数,前缀单独写死。sorted(root.iterdir()) 保证同一天的文件按原名排序拿序号,不排序的话序号顺序是随机的。脚本就 30 行,RULES 列表加一条正则就能支持新来源(比如 IMG_20260918_102233 之外的相机格式、IMG-20260918-WA0001 的 WhatsApp 格式)。如果你要的是"按拍摄日期建子文件夹 + 改名"、"按 EXIF 拍摄时间而不是文件名"、或者几百个文件夹批量跑——那是另一个量级的活,可以找我们代写(见下)。