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

递归遍历MP4执行FFprobe输出CSV的Bash脚本报错求助

解决Bash脚本递归遍历MP4并生成对应CSV的问题

我在运行一段Bash脚本时遇到报错,需求是让脚本递归遍历文件夹中的所有MP4文件,执行ffprobe命令并将结果输出到另一目录下,以对应MP4文件名命名的CSV文件中。目前我的脚本如下:

#!/bin/bash
for file in /this/is/directory1/*.mp4; do
    ffprobe -show_packets -of csv=print_section=0 $file >> /this/is/directory2/${file}.csv
done

我来帮你排查并修复这个脚本的问题,原脚本存在几个关键问题导致报错或不符合需求,以下是修正后的完整脚本,再逐条解释修改点:

#!/bin/bash

# 定义源目录和输出目录,方便后续修改
SOURCE_DIR="/this/is/directory1"
OUTPUT_DIR="/this/is/directory2"

# 确保输出目录存在,不存在则自动创建(包括父目录)
mkdir -p "$OUTPUT_DIR"

# 递归遍历源目录下所有MP4文件,处理带空格的文件名
find "$SOURCE_DIR" -type f -name "*.mp4" | while read -r file; do
    # 提取纯文件名(去掉完整路径)
    filename=$(basename "$file")
    # 构建输出CSV路径:去掉原文件的.mp4后缀,替换为.csv
    output_file="$OUTPUT_DIR/${filename%.mp4}.csv"
    
    # 执行ffprobe,静默模式避免冗余日志,用引号包裹路径处理空格
    ffprobe -quiet -show_packets -of csv=print_section=0 "$file" > "$output_file"
done

关键修改说明

  • 实现递归遍历:用find命令替代简单的for循环,-type f确保只处理文件,-name "*.mp4"匹配所有MP4格式文件,完美覆盖子目录中的目标文件
  • 处理路径错误:原脚本中${file}是完整路径,直接拼接会生成类似/this/is/directory2//this/is/directory1/file.mp4.csv的无效路径,现在用basename提取纯文件名,确保输出CSV仅以原MP4文件名命名
  • 兼容空格文件名:所有变量都用双引号包裹,read -r参数避免文件名中的空格被拆分,彻底解决含空格文件的解析错误
  • 确保输出目录存在:mkdir -p命令会自动创建不存在的输出目录,避免因目录缺失导致的写入失败
  • 优化输出逻辑:用>替代>>,确保每个CSV文件仅对应单个MP4的结果,不会重复追加内容;添加-quiet参数屏蔽ffprobe的冗余日志,让CSV只保留需要的数据包信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:03:00