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

如何在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

运行方法

  1. 给脚本添加执行权限:
chmod +x merge_videos.sh
  1. 在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

使用说明

  1. 给脚本加执行权限:chmod +x merge_recursive.sh
  2. 在root目录下运行:./merge_recursive.sh

关键改进点

  • 文件类型过滤:仅处理指定格式的视频文件,避免临时文件、合并后的视频被误加入列表
  • 错误处理:进入目录失败、无视频文件、合并失败时都会给出提示,且合并失败不删除源文件,更安全
  • 目录遍历支持:两种方案都能自动处理指定范围内的子目录,无需手动进入每个目录执行
  • 统一输出命名:符合你期望的concat.mp4命名规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:06:17