如何计算目录及子目录中每个文件的视频文件大小与视频时长的比率

如何计算目录及子目录中每个文件的视频文件大小与视频时长的比率

我想在 Linux 中制作一个 BASH 脚本。到目前为止我有以下内容

#!/bin/bash
for file in $(find "/home/drive1/videos" -type f -name '*.mp4' -o -name '*.avi' -o -name '*.mov'); do
  size=$(stat -c%s "$file")
  duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file")
  ratio=$(echo "scale=2; $size / $duration" | bc)
  echo "$file: size=$size, duration=$duration, ratio=$ratio"
done

但这给出了一个错误

stat: 无法 statx '/home/drive1/videos/file': 没有这样的文件或目录 /home/drive1/videos/file: 没有这样的文件或目录 (standard_in) 1: 语法错误 /home/drive1/videos/file:大小=、持续时间=、比例=

但是如果我只运行 find

find . -type f -name '*.mp4' -o -name '*.avi' -o -name '*.mov'

它显示文件:

./文件.mov

ffprobe 也可以工作,因为它使用以下命令显示视频文件的持续时间(以秒为单位)

ffprobe -v quiet -of csv=p=0 -show_entries format=duration file.mov 

40.707333

我做错了什么,有什么想法吗?提前感谢您的帮助!

干杯

答案1

请修改您的表达式以添加括号,以确保您的目标文件具有正确的扩展名。

find . -type f '(' -name '*.mp4' -o -name '*.avi' -o -name '*.mov' ')'

答案2

问题不在于查找,而在于 for 循环以及它如何处理文件名中的空格。我发现while-loops 对此非常方便:

find "/home/drive1/videos" -type f -name '*.mp4' -o -name '*.avi' -o -name '*.mov' | while read -r file
do 
    size=$(stat -c%s "$file")
    duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$file")
    ratio=$(echo "scale=2; $size / $duration" | bc)
    echo "$file: size=$size, duration=$duration, ratio=$ratio"
done

相关内容