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