求适配Emby的剧集文件夹整理脚本:批量迁移并重命名剧集目录结构
求适配Emby的剧集文件夹整理脚本:批量迁移并重命名剧集目录结构
我完全懂你现在的困扰——一堆零散的剧集文件夹,有的单集单独占一个目录,有的整季打包成一个目录,想整理成Emby能完美识别的规范结构,还得保留原文件夹里的所有内容不动对吧?刚好可以用一个bash脚本来批量搞定这个事,下面我把脚本、用法和注意事项给你理得明明白白:
先明确需求(怕我理解错,再核对一遍)
你的核心要求就是:
- 原剧集文件夹的内部结构、文件名完全保留,只做目录迁移
- 从原文件夹名里自动提取「剧集名称」和「季数」(比如
S01对应Season 01) - 最终统一成Emby标准结构:
/home/incoming/TV/[剧集名称]/Season [季数]/[原文件夹名]/
比如你举的例子:
- 原目录
Altered.Carbon.S01E05.The.Wrong.Man.1080p.DDP5.1.x264/→ 迁移到Altered Carbon/Season 01/下 - 原目录
Black Mirror S01 1080p DD+ 2.0 x264/→ 迁移到Black Mirror/Season 01/下
直接上可用的bash脚本
把下面的代码保存成organize_tv.sh文件:
#!/bin/bash # 目标根目录:所有整理后的剧集都会放到这个目录下的对应子文件夹 TARGET_ROOT="/home/incoming/TV" # 遍历当前目录下的所有剧集文件夹(脚本放在要处理的目录下执行即可) for folder in ./*; do # 只处理目录,跳过普通文件 [ -d "$folder" ] || continue # 获取纯文件夹名(去掉路径前缀) FOLDER_NAME=$(basename "$folder") # 提取季数:匹配S后面跟两位数字的格式(比如S01、S02) SEASON=$(echo "$FOLDER_NAME" | grep -o 'S[0-9][0-9]' | head -n 1) if [ -z "$SEASON" ]; then echo "⚠️ 警告:无法从 $FOLDER_NAME 中提取季数,跳过该文件夹" continue fi # 转换成Emby喜欢的Season 01格式 SEASON_DIR="Season ${SEASON:1}" # 提取剧集名称:先去掉季数及后面的内容,再把点号换成空格,清理末尾多余空格 SERIES_NAME=$(echo "$FOLDER_NAME" | sed "s/${SEASON}.*//" | tr '.' ' ' | sed 's/[[:space:]]*$//') # 兼容空格分隔的命名格式(比如Black Mirror S01...) if [ -z "$SERIES_NAME" ]; then SERIES_NAME=$(echo "$FOLDER_NAME" | sed "s/ ${SEASON}.*//" | tr '.' ' ' | sed 's/[[:space:]]*$//') fi if [ -z "$SERIES_NAME" ]; then echo "⚠️ 警告:无法从 $FOLDER_NAME 中提取剧集名称,跳过该文件夹" continue fi # 构建最终的目标路径 DEST_PATH="${TARGET_ROOT}/${SERIES_NAME}/${SEASON_DIR}" # 创建目标目录(如果不存在的话) mkdir -p "$DEST_PATH" # 移动原文件夹到目标位置(-v参数可以显示移动过程) mv -v "$folder" "$DEST_PATH/" done echo "🎉 批量整理完成!"
脚本使用步骤
- 放置脚本:把
organize_tv.sh放到/home/incoming/TV目录下(就是你存放零散剧集文件夹的那个目录) - 赋予执行权限:打开终端,执行下面的命令:
chmod +x organize_tv.sh - 执行脚本:进入
/home/incoming/TV目录,执行:./organize_tv.sh
几个重要的注意事项
- 先测试再批量:建议先复制几个剧集文件夹到测试目录,跑一遍脚本看看效果,确认符合预期再批量执行
- 兼容多种命名:脚本支持两种常见的剧集命名格式——点分隔(比如
Altered.Carbon.S01...)和空格分隔(比如Black Mirror S01...) - 容错机制:如果某个文件夹名里找不到
Sxx格式的季数,或者提取不出剧集名称,脚本会自动跳过并提示,不会乱处理 - 自定义路径:如果你的剧集不在
/home/incoming/TV下,修改脚本开头的TARGET_ROOT变量为你的目标根目录即可
备注:内容来源于stack exchange,提问作者Loop1




