如何通过for循环将剧集文件名去除季数后设为目标文件夹名
问题描述
现有剧集文件Fast Fast S01E02.mkv,希望通过for循环调用ffmpeg处理后,将输出文件保存到/media/Fast Fast/Fast Fast S01E02.mkv目录下。需要从文件名中提取去除S01E02及后续内容后的部分作为目标文件夹名,当前使用的命令如下:
for f in *.mkv; do ffmpeg -i "$f" -i logo.png -filter_complex "overlay=40:main_h-overlay_h-40" -codec:a aac -c:v h264 /media/folder name/"${f%.*}".mkv
解决方案
可以利用Bash的参数扩展功能提取剧集名称,再动态创建目标目录并执行转换,修改后的命令如下:
for f in *.mkv; do # 提取去除SxxExx标识后的剧集名称 show_name="${f% S[0-9][0-9]E[0-9][0-9]*}" # 定义完整的输出目录路径 output_dir="/media/${show_name}" # 创建目录(-p参数确保父目录不存在时也能创建,且目录已存在时不报错) mkdir -p "$output_dir" # 执行ffmpeg转码并输出到目标目录 ffmpeg -i "$f" -i logo.png -filter_complex "overlay=40:main_h-overlay_h-40" -codec:a aac -c:v h264 "${output_dir}/${f%.*}.mkv" done
关键说明
${f% S[0-9][0-9]E[0-9][0-9]*}:%是Bash的参数扩展运算符,作用是从字符串末尾匹配并删除最短的符合指定模式的内容。这里的模式S[0-9][0-9]E[0-9][0-9]*会匹配S后两位数字、E后两位数字,以及之后的所有字符,前面的空格确保只匹配独立的季集标识(避免误删文件名中包含类似字符的部分)。mkdir -p "$output_dir":确保目标目录存在,即使/media下没有对应的剧集文件夹也能自动创建,避免ffmpeg因目录不存在报错。
内容的提问来源于stack exchange,提问作者Mostafa Daash
相关产品推荐
相关产品推荐

