ディレクトリとサブディレクトリの各ファイルのビデオファイルサイズとビデオ期間の比率を計算する方法

ディレクトリとサブディレクトリの各ファイルのビデオファイルサイズとビデオ期間の比率を計算する方法

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: '/home/drive1/videos/file' を statx できません。そのファイルまたはディレクトリはありません。 /home/drive1/videos/file: ファイルまたはディレクトリが存在しません (standard_in) 1: 構文エラー /home/drive1/videos/ file : size=, period=, scale=

しかし、ただ実行するとfind

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

ファイルが表示されます。

./file.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

関連情報