递归遍历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
相关产品推荐
相关产品推荐

