告别乱命名:用正则表达式打造自动刮削的本地番剧库
打开我存放动画剧集的文件夹经常能看到类似dragonballsuper_107-1.mkv这样的文件名。作品名倒是看得懂107 也能猜出是第 107 集可那个-1到底是怎么回事为什么一集动画会被拆成两个文件这种命名如果只有一两个还好说攒了上千集之后整个文件夹就变成了一团乱麻。今天我想借这个典型的乱命名案例聊聊我是怎么把这种混乱的本地番剧库整理成一套结构清晰、能自动生成海报墙的媒体仓库。1. 先读懂文件名dragonballsuper_107-1 在说什么1.1 文件名本身的信息量一个看似随意的文件名其实是发布者留给你的全部线索。dragonballsuper_107-1可以拆成三个信息段dragonballsuper指作品名称这里用的是英文名而不是中文名。107是总集数编号代表这部作品的第 107 集。-1是分段标识表示这一集被拆成了多个文件片段这是第一个片段。所以完整解读就是某动画作品第 107 集的片段一。这种命名方式在早年间的网络分享环境中非常常见源头有两个。一是字幕组压制后在传输过程中做了分包尤其是早期网盘单文件大小受限时一集 200MB 的动画会被拆成三个 70MB 左右的包下载后需要自己合并。二是某些播放设备对单文件大小或时长有硬性限制所以发布方干脆拆开。问题在于分包信息只到了-1这种程度没有告诉你这是总第几集、属于哪一季也没有分辨率、编码、音轨等关键信息时间一长必然混乱。1.2 番剧命名里的常见习惯相声讲究“台上十分钟台下十年功”文件命名也是这样。不同发布来源的命名风格差异极大混在一起看尤其头疼命名风格示例特点纯数字编号dragonballsuper_107-1信息少容易冲突季集编号DragonBall.Super.S01E107.1080p媒体库友好但手动命名繁琐中文习惯命名龙珠超 第107话 完结篇直观但刮削器容易认不出带完整参数的命名DragonBall.Super.E107.1080p.BluRay.x265.10bit信息完整一眼看懂画质来源对折腾过本地媒体库的人来说S01E107这种编号是大家最熟悉的规范。可问题来了一部连续播放、不分季的动画到底该怎么映射到季-集体系里我的做法是把它统一视作第一季第 107 集就写成S01E107。这样命名的好处是主流刮削器都能识别而且在文件管理器中按名称排序时数字编号会自然按集数排列不会出现第 100 集排在第 21 集前面的尴尬。2. 目录结构设计把散落的剧集变成一座图书馆2.1 三层目录按作品、季别、版本归档如果说文件命名是给单个文件盖章那目录结构就是给整座仓库搭货架。我最早期犯过的错误是把所有动画直接丢进同一个大文件夹导致的结果是不同作品混放在一起同一作品的多种分辨率版本叠在一起字幕文件散落在各处。后来我逐渐形成了一套固定的三层结构实测下来非常稳动画库/ 龙珠超/ Season 01/ 龙珠超_S01E107_1080p.mkv 龙珠超_S01E107.ass 龙珠超_S01E107.jpg第一层是作品名第二层是季目录第三层是具体的视频、字幕和封面文件。如果你收藏里同时有 720p 和 1080p 两种版本可以在第三层里再细分1080p/和720p/两个子目录而不是混着放。这样做的逻辑很简单当你想要快速检查某部作品是否完整时只需要在第二层扫一眼季目录当你需要替换某个低分辨率版本时只需要在对应版本目录里操作不会误动到其他文件。2.2 字幕和封面的存放策略字幕文件的放置位置是个容易踩坑的细节。主流播放器和媒体库都能识别同名视频文件 同名字幕文件放在同一目录的模式比如龙珠超_S01E107.mkv配龙珠超_S01E107.ass播放器会自动加载字幕。但如果你把字幕统一收进一个subs/文件夹绝大多数播放器就找不到它了每次播放都得手动挂载字幕体验极差。封面文件也一样。媒体库刮削器通常会自己去网络数据库拉取海报但如果你处于断网环境或者希望封面风格统一手动放置folder.jpg或poster.jpg就是最直接的手段。注意大小写和扩展名Folder.jpg和folder.jpg在 Linux 环境中是不同文件跨平台使用时最好统一用小写字母规范命名。还有一个容易被忽略的点不要用中文全角括号、空格、特殊符号做目录名比如龙珠超第一季这种目录名在某些脚本和自动刮削工具中会引发编码问题。虽然日常 Windows 使用没问题但一旦你需要写 PowerShell 或 Python 脚本批量处理全角标点和空格会让你多出不少转义烦恼。统一用英文括号、句点和下划线是最保险的选择。3. 批量重命名实战用正则表达式一次搞定几百个文件3.1 手动改名到底有多痛苦面对几百个dragonballsuper_107-1、dragonballsuper_107-2这样的文件手动按 F2 逐个改名是最消磨耐心的操作。我之前就吃过大亏一边看剧一边改文件改到第 80 多个时手一滑把两个集数写反了结果媒体库里的集数排列错位后面所有剧集都跟着乱。后来我决定把所有重命名工作全部交给脚本和工具完成宁可多花半小时写正则也不再用手指跟文件名较劲。3.2 正则表达式与两个常用命令如果你想批量把dragonballsuper_107-1.mkv改成DragonBall.Super.S01E107.1080p.mkv核心思路是提取出集数数字再重组文件名。这是正则表达式最典型的应用场景。先看一个最朴素的示例假设你的文件都在 Linux 或 macOS 的 bash 环境下for f in dragonballsuper_*.mkv; do num$(echo $f | sed -E s/.*_([0-9])-([0-9])\.mkv/\1/) mv $f DragonBall.Super.S01E${num}.1080p.mkv done这段脚本干的活是遍历所有符合dragonballsuper_*.mkv模式的文件用sed抓取集数数字然后重命名。-E开启扩展正则([0-9])表示捕获一组连续数字\1引用第一组捕获内容。Windows 用户也不用慌PowerShell 同样能做而且对新手来说更友好一些Get-ChildItem dragonballsuper_*.mkv | ForEach-Object { if ($_.Name -match _(\d)-(\d)\.mkv$) { $ep $matches[1] Rename-Item $_ DragonBall.Super.S01E${ep}.1080p.mkv } }-match运算符和$matches内置变量是 PowerShell 里的黄金搭档匹配成功后捕获组会逐一出现在$matches[1]、$matches[2]中。这里(\d)就是正则里的数字捕获组和 sed 中的([0-9])异曲同工。3.3 正则表达式入门分组、锚定与转义我见过不少人一听到正则就觉得是黑魔法其实核心就三条规则。第一分组用圆括号。(107)能把 107 单独捞出来后续可以用$1或\1引用。第二锚定符号。^匹配开头$匹配结尾比如_(\d)\.mkv$确保匹配目标是以数字开头、.mkv结尾的文件名避免误伤同目录下的封面文件。第三转义点号。正则里的.代表任意字符不是你文件名里的点。所以要匹配.mkv必须写成\.mkv。我实际工作中用得最多的组合是.*?非贪婪匹配它可以匹配尽可能短的字符串。比如处理dragonballsuper_107-1.mkv和dragonballsuper_108-1.720p.mkv这种长度不一的文件名时.*?能灵活跳过中间差异部分直达我需要提取的数字段。初学阶段不用追求一招打天下先会用分组、锚定、字符集[0-9]这三种就能覆盖八成以上的批处理需求。3.4 实战案例从一堆乱命名到规范目录为了让你直观感受效果我放一个小批量转换前后的对照。假设目录里有dragonballsuper_107-1.mkv dragonballsuper_107-2.mkv dragonballsuper_108-1.mkv dragonballsuper_108-2.mkv执行上面的 PowerShell 脚本后得到DragonBall.Super.S01E107.1080p.mkv DragonBall.Super.S01E107.Part2.mkv DragonBall.Super.S01E108.1080p.mkv DragonBall.Super.S01E108.Part2.mkv这里有一个细节-2命名的后半段我保留了Part2标识因为第二段文件不能和第一段用完全相同的文件名否则会互相覆盖。如果你的播放器支持分集合并播放保留Part2是必要的但大多数媒体库更推荐的做法是直接把两个片段合并成一个完整 MKV这样最省心。合并可以用 FFmpeg虽然它是命令行工具但操作并不复杂。4. 究极细节媒体库刮削器的命门在哪里4.1 刮削器是怎么认文件的我折腾本地媒体库这么多年最深的一个体会是刮削器不认人只认文件名。当你在 Jellyfin、Kodi 或 Plex 里添加媒体库后它会扫描目录下的文件名提取出作品名 季集编号然后去在线数据库匹配。所以dragonballsuper_107-1.mkv这种命名刮削器大概率会识别失败因为它既没有明显季集标识还带了个莫名其妙的-1。规范的DragonBall.Super.S01E107.1080p.mkv就完全不一样了。刮削器看到S01E107就能快速定位到第一季第 107 集进而在数据库拉取对应的标题、简介、海报和剧照。这里也解释了一个常见问题为什么有人把文件放在正确的目录里媒体库却不显示海报。十有八九是文件名没带季集编号或者用了第107话这种刮削器不认识的表达。4.2 常见的命名陷阱与修复方式我不是说中文命名一定不行但在刮削这件事上遵循惯例赢面最大。几种我踩过的典型坑缺少季标识DragonBall.Super.107这种写法刮削器可能把 107 当成季号而不是集号。多余的后缀DragonBall.Super.S01E107.END.1080p里的END会被某些刮削器误读为版本信息导致匹配失败。作品名不对刮削器依赖作品名的精确匹配DragonBall.Super和Dragon Ball Super可能代表同一个意思但数据库里存的是后者前者就可能匹配不到。修复方式没有捷径尽量用标准的作品名.S季E集.画质.编码格式。如果目录里已经有一批文件被刮削错误直接在刮削器里执行刷新元数据并强制搜索手动输入正确的作品名后通常就能纠正回来。4.3 元数据文件 NFO 到底要不要用NFO 文件是媒体库刮削结果的存档里面记录了刮削器从数据库拉回来的标题、简介、演职员表等信息。如果你对自动刮削的稳定性不满意或者经常离线使用我建议手动放置 NFO 文件。它本质上是 XML 格式的文本可以手动编辑也可以借助 Tiny Media Manager 这类工具自动生成。NFO 和海报文件配合使用等于给每一集都写了一张身份卡即使断网媒体库也能完整显示信息。不过 NFO 有个副作用它比文件名更顽固。媒体库优先读 NFO 后就不会再去在线数据库更新这意味着如果你的 NFO 是错的后续刮削也会一直错下去。所以我的策略是新入库的文件先不手动放 NFO等刮削器自动匹配后再检查只有自动匹配失败的个别文件才手动补 NFO。5. 常见问题与排查技巧实录5.1 文件名乱码和集数错位我遇到最多的问题就是集数错位。举个例子你下载了第 100 集到第 110 集的资源但某个来源漏掉了第 105 集文件名还是正常递增的。这时候如果盲目批量重命名第 106 集就会变成 105 集的文件名媒体库里后面的所有集数全部偏移。排查方法很简单重命名之前先检查完整集数列表是不是连续的。用脚本扫一遍文件名中的数字看是否有跳号再决定怎么处理。乱码问题常见于繁体中文和日文汉字。某些字幕组会把文件名写成龍珠超 第107話繁体字在简体中文系统里显示正常但在某些媒体库容器里会出现编码错误导致乱码或匹配失败。我的处理方式是用脚本把繁转简或者干脆全部改成英文命名彻底绕开编码问题。5.2 重复文件与空间浪费收藏时间长了同一个作品往往会存多个版本。dragonballsuper_107-1.mkv可能是 720p 的旧版本后来你又下载了 1080p 的新版本文件名可能叫DB_107.mkv。两个文件内容一样白白占硬盘空间。判断重复不能只看文件名我建议用哈希比较。PowerShell 里一条命令就能算出全文件夹文件的 MD5 值Get-ChildItem *.mkv | Get-FileHash -Algorithm MD5 | Export-Csv hash.csv然后横向对比文件名和哈希值就能找出内容相同但名字不同的双胞胎文件。删掉冗余版本之前记得先确认媒体库里没有指向旧文件的收藏记录。5.3 特殊剧集处理剧场版、OVA 与特别篇剧场版、OVA 和特别篇是本地媒体库里的老大难。它们不属于正常季集编号文件名又常常是独立的刮削器经常把《某作品剧场版》错误归类到正片季集里。我的处理方案是把这些内容单独建目录不混在正片季目录下动画库/ 龙珠超/ Season 01/ Specials/ 龙珠超_剧场版_布罗利.mkv 龙珠超_Specials_S01E01.mkvSpecials目录在媒体库规范里对应第 0 季很多刮削器支持识别Specials目录下的文件为特别篇。如果没有特殊季需求直接把剧场版独立存放、独立刮削也比混在正片里强。5.4 片头片尾与多音轨要不要保留最后聊一个很多人忽略的问题-1这种分段文件往往发生在片头曲或片尾曲的位置分段点刚好卡在正片开始或结束的地方。如果你合并了分段文件并打算长期归档我建议保留完整的片头片尾不要为了省空间单独切掉。因为你今天觉得片头没用明天可能就想回顾某个版本的片头动画。至于多音轨优先保留原始音轨和一条国配就足够了真要追求极简至少也不要丢掉原始音轨那是资源价值的核心所在。6. 个人经验整理资源库的节奏感如果你问我整理一个千集规模的番剧库最重要的事是什么我的回答是一次只做一件事。不要一边重命名一边想着刮削也不要一边整理目录一边清理重复文件。分阶段执行先设计目录结构再统一重命名然后检查剧集连续性最后交给媒体库刮削。每一步完成后先验证结果再进入下一步。这样做看起来慢实际上最节省时间因为你不会因为中途改主意而推翻之前的劳动成果。我还想分享一个小习惯每次下载完新内容第一时间就把它改名归位而不是攒到月底统一整理。碎片化处理十次每次三分钟远比一次性花两小时面对两百个乱命名文件要从容得多。一个好的文件名放在目录里五年后回头看依然一眼就能看懂这才是整理的真正意义。

相关新闻

GLM5.0进化成智能工作系统:从对话聊天到自动干活

GLM5.0进化成智能工作系统:从对话聊天到自动干活

GLM5.0发布那天,我第一时间没去看直播里的演示Demo,而是直接拿它跑了三个真实业务场景:一份50页的行业报告摘要、一个带异常值的数据清洗任务、一段缺了注释的旧项目代码补全。测完之后我的判断是——这代模型的进化方向,已经从“…

2026/10/19 13:38:58 阅读更多 →
open-code-review落地实践:自动化规则引擎重塑代码审查流程

open-code-review落地实践:自动化规则引擎重塑代码审查流程

代码审查这事,我一直觉得是开发流程里最容易被低估的一环。很多团队都有 review 制度,但实际情况往往是:合并前有人点个通过,或者全团队盯着一两个“大佬”帮大家把关,代码规范全凭个人自觉。我自己带过团队&#xff0…

2026/10/19 13:38:58 阅读更多 →
网页播放监控视频:WEB播放器插件接入与排错指南

网页播放监控视频:WEB播放器插件接入与排错指南

刚过去的这个季度,我连续被好几个项目问了差不多的事:网页上要播放摄像头监控视频,用哪个WEB播放器插件?客户装的是某安防厂商的设备,给了一堆接口文档,前端同事看着ActiveX、NPAPI、WebVideoCtrl一脸懵。这…

2026/10/19 13:38:58 阅读更多 →

最新新闻

基于Atlas的MySQL读写分离与分库分表实践指南

基于Atlas的MySQL读写分离与分库分表实践指南

1. 项目整体设计与适用场景解析1.1 这个项目到底解决什么问题做后端开发的人应该都有这种感觉:业务量一上来,数据库最先扛不住。单库单表跑到一定量级,写入并发和查询延迟都会明显恶化,这时候大部分人第一反应是上缓存、做读写分离…

2026/10/19 14:16:37 阅读更多 →
从索引策略到查询性能飞跃:SQL优化实战全解析

从索引策略到查询性能飞跃:SQL优化实战全解析

接手过一个让人头疼的性能工单:业务方反馈某个查询在数据量涨到百万级之后,响应时间从几十毫秒直接飙升到十几秒,前端超时,接口报警刷屏。第一反应以为是数据库负载问题,结果一查,表结构里有索引&#xff0…

2026/10/19 14:16:37 阅读更多 →
YOLOv5/YOLOv8水果好坏检测实战:从数据标注到模型部署

YOLOv5/YOLOv8水果好坏检测实战:从数据标注到模型部署

我前阵子接了个果蔬分拣相关的视觉项目,核心需求就是把大小不一的水果照片按“好果”和“坏果”自动分好类。这类需求在农产品标准化、商超自动结算、生鲜供应链质检场景里特别常见。我们最终选型就用 YOLOv5 和 YOLOv8 做了整套方案,配套整理了一份带标…

2026/10/19 14:16:37 阅读更多 →
Crypto-XOR2实战:循环密钥与字节反转的完整解密思路

Crypto-XOR2实战:循环密钥与字节反转的完整解密思路

简介:一份面向广东大学生网络攻防大赛参赛者、CTF Crypto方向练习者的crypto-xor2题目附件包,重点考察异或(XOR)加密原理与密文分析思路。资源包共2个文件,压缩后仅460B,包含密文文件cipher和同名Python脚本task.py,后…

2026/10/19 14:16:37 阅读更多 →
图书馆AI问答助手“热启动”:用RAG让大模型告别胡言乱语

图书馆AI问答助手“热启动”:用RAG让大模型告别胡言乱语

做过图书馆信息化的人应该都有体会:读者问的问题,翻来覆去就那么几类——闭馆时间、借阅规则、馆藏位置、数据库使用、预约取书……但通用大模型一上场,经常“一本正经地胡说八道”,要么告诉你一个根本不存在的开馆时间&#xff0…

2026/10/19 14:16:37 阅读更多 →
软考软件设计师:程序设计语言基础与编译原理考点全梳理

软考软件设计师:程序设计语言基础与编译原理考点全梳理

软考软件设计师上午题一共75道选择题,涉及的知识面铺得非常广。很多人复习到“程序设计语言基础知识”这一章时,都会有同样的感觉:内容不难,但概念太细,编译原理相关的几个阶段总是看完就混,文法那四种类型…

2026/10/19 14:15:32 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →