如何在Bash中递归进入多文件夹运行FFmpeg视频合并脚本?
递归子目录执行FFmpeg视频合并脚本的解决方案
问题分析
你现有的脚本仅能在单个目录下运行,无法自动遍历子目录执行;同时原脚本未做文件类型过滤,会把临时文件、生成的合并视频也加入列表,导致执行错误。下面提供两种可行的改进方案。
方案一:可接收目录参数的独立脚本
先将脚本修改为支持传入目标目录的形式,再用find命令遍历子目录调用它。
改进后的脚本(命名为merge_videos.sh)
#!/bin/bash # 校验参数数量 if [ $# -ne 1 ]; then echo "用法: $0 <目标目录路径>" exit 1 fi TARGET_DIR="$1" # 进入目标目录,失败则退出 cd "$TARGET_DIR" || { echo "无法访问目录: $TARGET_DIR"; exit 1; } # 仅筛选MP4视频文件(可自行添加其他格式,如 *.mov *.avi) VIDEO_FILES=(*.mp4) # 无视频文件则跳过 if [ ${#VIDEO_FILES[@]} -eq 0 ]; then echo "目录 $TARGET_DIR 无MP4文件,跳过处理" exit 0 fi # 生成FFmpeg合并所需的文件列表 > files.txt for f in "${VIDEO_FILES[@]}"; do echo "file '$f'" >> files.txt done # 生成待删除的源文件列表 > filesdelete.txt for f in "${VIDEO_FILES[@]}"; do echo "'$f'" >> filesdelete.txt done # 执行视频合并,输出为concat.mp4 if ffmpeg -f concat -safe 0 -i files.txt -c copy "concat.mp4"; then # 合并成功才删除源文件 xargs -I{} rm -f "{}" < filesdelete.txt echo "$TARGET_DIR 合并完成,已删除源文件" else echo "$TARGET_DIR 合并失败,保留源文件" fi # 清理临时文件 rm -f files.txt filesdelete.txt
运行方法
- 给脚本添加执行权限:
chmod +x merge_videos.sh
- 在root目录下执行,遍历所有直接子目录:
find . -type d -mindepth 1 -maxdepth 1 -exec ./merge_videos.sh {} \;
- 若需要递归处理所有层级的子目录,去掉
-maxdepth 1参数即可。
方案二:内置遍历逻辑的单脚本
直接将目录遍历逻辑写进脚本,无需额外调用find,在root目录运行即可自动处理所有子目录。
#!/bin/bash # 遍历当前目录下的所有直接子目录(如需递归所有层级,删除 -maxdepth 1) find . -type d -mindepth 1 -maxdepth 1 | while read -r DIR; do echo "开始处理目录: $DIR" cd "$DIR" || { echo "无法进入目录 $DIR,跳过"; continue; } # 筛选MP4视频文件 VIDEO_FILES=(*.mp4) if [ ${#VIDEO_FILES[@]} -eq 0 ]; then echo "无MP4文件,跳过" cd .. continue fi # 生成FFmpeg文件列表 > files.txt for f in "${VIDEO_FILES[@]}"; do echo "file '$f'" >> files.txt done # 生成待删除文件列表 > filesdelete.txt for f in "${VIDEO_FILES[@]}"; do echo "'$f'" >> filesdelete.txt done # 执行合并,成功才删源文件 if ffmpeg -f concat -safe 0 -i files.txt -c copy "concat.mp4"; then xargs -I{} rm -f "{}" < filesdelete.txt echo "$DIR 处理完成" else echo "$DIR 合并失败,源文件保留" fi # 清理临时文件并返回上级目录 rm -f files.txt filesdelete.txt cd .. done
使用说明
- 给脚本加执行权限:
chmod +x merge_recursive.sh - 在root目录下运行:
./merge_recursive.sh
关键改进点
- 文件类型过滤:仅处理指定格式的视频文件,避免临时文件、合并后的视频被误加入列表
- 错误处理:进入目录失败、无视频文件、合并失败时都会给出提示,且合并失败不删除源文件,更安全
- 目录遍历支持:两种方案都能自动处理指定范围内的子目录,无需手动进入每个目录执行
- 统一输出命名:符合你期望的
concat.mp4命名规范
内容的提问来源于stack exchange,提问作者Sam Feldman
相关产品推荐
相关产品推荐

