下载了一堆视频怎么整理?一套批量重命名与归类的思路
下载器跑完,文件夹里往往是一地鸡毛:video(1).mp4、未命名.mp4、缓存文件_20230801_abc.mp4……几千个文件要按"剧集/季/清晰度"归档,手动改名能改到崩溃。这活最适合写个脚本批量来。这篇文章给一套可复用的方法。
先想清楚规则
整理前先定规则,比如:
- 电视剧:
剧名 S01E01.mp4,季用两位、集用两位; - 按分辨率分文件夹:
1080p/、720p/; - 按拍摄日期:
2023-08/这种。
规则不定,脚本写一百遍也是乱的。
从文件名里抠信息
很多下载器文件名自带集数,用正则抓:
import re, os, shutil
def parse_ep(name):
m = re.search(r'[Ee](\d{1,2})', name)
return int(m.group(1)) if m else None
for f in os.listdir('.'):
if not f.endswith('.mp4'):
continue
ep = parse_ep(f)
if ep is None:
continue
new = f'剧集 S01E{ep:02d}.mp4'
shutil.move(f, new)
从元数据里抠信息
文件名啥都没有,但视频里藏着拍摄时间、分辨率。用 ffprobe 取:
ffprobe -v error -select_streams v:0 \
-show_entries stream=width,height \
-of csv=p=0 input.mp4
Python 里可以用 subprocess 调它,按 height 分到 1080p/ 或 720p/:
import subprocess, json, os
def probe(path):
out = subprocess.check_output([
'ffprobe', '-v', 'error', '-show_format', '-show_streams',
'-of', 'json', path
])
return json.loads(out)
info = probe('a.mp4')
h = next(s for s in info['streams'] if s['codec_type']=='video')['height']
folder = f"{h}p"
os.makedirs(folder, exist_ok=True)
shutil.move('a.mp4', os.path.join(folder, 'a.mp4'))
几个血泪教训
| 坑 | 后果 | 避免 |
|---|---|---|
| 同名覆盖 | 文件直接没了 | move 前检查目标是否存在 |
| 特殊字符 | 脚本报错中断 | 用 pathlib,别手拼路径 |
| 排序错乱 | 1,10,11,2... | 用自然排序或补齐零 |
| 中途失败 | 半整理状态更乱 | 先复制到新目录,成功再删原文件 |
常见问题
Q:能不能边下边整理? 可以,但建议下载完再整理,避免半个文件被误判。
Q:重命名会破坏播放列表吗? 如果你用 m3u8 这类依赖文件名的,改名后得相应改清单;普通 mp4 不受影响。
Q:有没有现成工具? 有,FileBot 之类专门做媒体整理,规则图形化配置;自己写脚本则更灵活。