如何用Bash将同名媒体文件移至对应目录(Plex场景)
整理Plex电影目录:将同名视频与字幕归类到独立文件夹
我的Plex电影目录中,所有视频文件(含多种格式)和字幕文件都存放在根目录,需要把每组同名的视频与字幕文件,移动到以该名称命名的独立目录中。
当前目录结构
Alita Battle Angel (2019).en.srt Alita Battle Angel (2019).m4v Anchorman The Legend of Ron Burgundy (2004).mp4 Anchorman The Legend of Ron Burgundy (2004).srt Ant-Man (2015).en.srt Ant-Man (2015).m4v Ant-Man and the Wasp (2018).en.srt Ant-Man and the Wasp (2018).m4v Aquaman (2018).en.srt Aquaman (2018).m4v Argo (2012).en.forced.srt Argo (2012).en.srt Argo (2012).m4v ...
期望整理后的结构
Alita Battle Angel (2019)/ ├─ Alita Battle Angel (2019).en.srt └─ Alita Battle Angel (2019).m4v Anchorman The Legend of Ron Burgundy (2004)/ ├─ Anchorman The Legend of Ron Burgundy (2004).mp4 └─ Anchorman The Legend of Ron Burgundy (2004).srt Ant-Man (2015)/ ...
我曾尝试以下脚本在测试目录运行,但担心误操作媒体库,需要更可靠的解决方案:
for f in *; do [[ -f "$f" ]] || continue dir="${f%.*}" mkdir "$dir" mv "$f" "$dir" done
可靠解决方案
改进后的脚本
原脚本存在重复创建目录报错、目录名提取逻辑错误的问题,以下是修正后的稳定版本:
# 遍历当前目录下的所有文件 for f in *; do # 只处理普通文件,跳过已存在的目录 [[ -f "$f" ]] || continue # 提取电影主名称:去掉第一个点之后的所有内容,得到"电影名(年份)" dir_name="${f%%.*}" # 目录不存在时才创建,避免重复创建报错 if [[ ! -d "$dir_name" ]]; then mkdir -p "$dir_name" fi # 移动文件,-n参数确保不覆盖已存在的文件 mv -n "$f" "$dir_name/" done
脚本关键说明
${f%%.*}:精准提取电影主名称,比如从Argo (2012).en.forced.srt中得到Argo (2012)mkdir -p:即使目录已存在也不会报错,提升脚本稳定性mv -n:防止意外覆盖目录内已有的文件,增加操作安全性
安全操作流程
- 先测试执行效果:将脚本中的
mv -n替换为echo mv -n,mkdir -p替换为echo mkdir -p,这样脚本只会输出即将执行的命令,不会实际修改文件,方便确认逻辑是否正确:
for f in *; do [[ -f "$f" ]] || continue dir_name="${f%%.*}" if [[ ! -d "$dir_name" ]]; then echo mkdir -p "$dir_name" fi echo mv -n "$f" "$dir_name/" done
- 备份文件:正式操作前,建议将整个电影目录备份到其他存储位置,避免意外操作导致文件丢失
- 测试目录验证:先在和真实目录结构一致的测试目录中执行脚本,确认结果符合预期后,再在Plex的真实媒体目录中运行
特殊情况处理
如果你的电影文件名中包含点(比如The Matrix.1999.mp4),可以用以下逻辑提取目录名:
# 提取到"(年份)"部分,适配文件名含点的情况 dir_name="${f%(*).*}" dir_name="${dir_name%)}"
内容的提问来源于stack exchange,提问作者Tharros89
相关产品推荐
相关产品推荐

