You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFMPEG批量转换时如何跳过指定扩展名的非视频文件?

方案实现

不推荐用ls -R处理文件名,容易因为文件名含空格、换行、特殊符号等场景出错,用find结合正则匹配视频后缀更稳妥,完全覆盖你的需求:

#!/bin/bash
# 配置项:可自行调整支持的视频后缀、FFmpeg编码参数
VIDEO_EXT_REGEX='\.(mp4|mkv|avi|mov|flv|wmv|rmvb|m4v|webm)$'
OUT_SUFFIX="_AAC.mp4"
# 后续换成x265编码直接修改下方FFMPEG_ARGS即可
FFMPEG_ARGS="-vcodec copy -acodec aac"

# 递归查找当前目录及子目录下所有符合后缀的文件,自动忽略.srt等非视频文件
find . -type f -regextype posix-extended -iregex "${VIDEO_EXT_REGEX}" | while read -r input_file; do
    # 生成输出文件名:移除原后缀追加输出标识
    output_file="${input_file%.*}${OUT_SUFFIX}"
    # 跳过已转码完成的文件,避免重复处理
    [[ "${input_file}" == *"${OUT_SUFFIX}" ]] && continue
    # 执行转码
    ffmpeg -i "${input_file}" ${FFMPEG_ARGS} -y "${output_file}"
    # 仅转码成功才删除原文件,避免出错丢失原文件
    if [[ $? -eq 0 ]]; then
        rm -f "${input_file}"
    fi
done
功能说明
  • 自动递归遍历当前目录及所有子目录,无需手动解析ls -R的输出
  • 仅匹配预设的常规视频后缀文件,自动忽略.srt字幕、文本、图片等非视频文件,匹配时不区分大小写(.MKV和.mkv都会被正常识别)
  • 增加转码成功校验逻辑,只有FFmpeg执行无异常才会删除原文件,避免转码失败导致原文件丢失
  • 自动跳过已生成的转码后文件,重复运行脚本也不会出现重复处理的问题
  • 后续切换x265编码时,仅需要修改FFMPEG_ARGS配置项即可,比如调整为FFMPEG_ARGS="-vcodec libx265 -crf 28 -acodec aac",其余逻辑无需改动
关于用正则替换*通配符的说明

Bash原生的*是通配符不是正则,如果你不需要遍历子目录,仅处理当前目录的文件,可以开启Bash的extglob扩展实现后缀匹配,无需使用find:

shopt -s extglob nocaseglob
for i in *.@(mp4|mkv|avi|mov|flv|wmv|rmvb|m4v|webm); do
  # 此处写入和上方逻辑一致的转码代码即可
done

该写法仅支持处理当前目录文件,需要遍历子目录还是推荐使用find方案更稳定。

内容的提问来源于stack exchange,提问作者WhiteRau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 15:45:03