FFmpeg批量转码脚本优化需求:转完即移文件、兼容多格式等
优化FFmpeg视频转码与原文件移动脚本
以下是满足你需求的优化后脚本:
# 开启nullglob,避免通配符无匹配时传递无效参数 shopt -s nullglob # 遍历所有MOV/AVI格式的大小写文件 for f in *.{mov,MOV,avi,AVI}; do # 执行FFmpeg转码,-y参数覆盖已存在的MP4文件 ffmpeg -y -i "$f" "${f%.*}.mp4" # 检查转码是否成功,仅成功时移动原文件 if [ $? -eq 0 ]; then # 根据文件后缀(统一转小写判断)确定归档目录 case "${f,,}" in *.mov) mv -f "$f" /Users/me/Videos/mov ;; *.avi) mv -f "$f" /Users/me/Videos/avi ;; esac echo "处理完成:$f" else echo "转码失败:$f,原文件未移动" fi done # 关闭nullglob,还原shell默认行为(可选) shopt -u nullglob
优化细节说明
1. 单文件转码完成后立即归档
- 将移动操作整合到循环内部,仅在FFmpeg转码成功后通过
$? -eq 0判断退出状态码执行移动,避免转码失败时误移原文件。 - 单个文件处理完就归档,脚本中断时已完成的文件都已整理到位,剩余未处理文件清晰可见,无需重新核对进度。
2. 一次性处理所有目标格式文件
- 使用
*.{mov,MOV,avi,AVI}通配符,直接匹配所有大小写的MOV/AVI文件,无需手动修改通配符切换格式。 - 配合
shopt -s nullglob,当某个后缀没有匹配到文件时,通配符会自动忽略该模式,不会传递无效参数给循环。
3. 消除MV命令无文件报错问题
- 循环内针对单个文件执行
mv,不存在批量匹配不到文件的场景,从根源避免报错。 - 通过
${f,,}将文件名转为小写后判断后缀,统一处理大小写格式的归档路径,无需重复编写多条mv命令。 nullglob选项确保当没有匹配到任何目标文件时,循环不会执行空命令(比如不会出现for f in *.mov无匹配时,$f变成字符串*.mov的问题)。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

