bashスクリプトの最後のステップを助ける人がいますか?私がここまで来るのを手伝ってくれました。
#!/bin/bash
find . -type f \
-name '*.mp4' -o -name '*.mkv' \
-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")
codec=$(ffprobe -v error -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 "$file")
ratio=$(bc <<< "scale=2; $size / $duration")
echo "$file: codec=$codec, size=$size, duration=$duration, ratio=$ratio" | tee -a /home/user/Downloads/logfile
printf $ratio | awk '{print $1/1000}'| tee -a /home/user/Downloads/logfile
done
これで、すべての結果がテキストファイルに入ります。しかし、比率が次より大きいファイルのみを選択する方法はありますか?
@markp-fusoの要求に応じていくつかのことを明確にしました。
$ratioの例をいくつか使用して質問を更新してください。
$ratioの数字は、ビデオファイルのサイズ(バイト単位)をビデオファイルの持続時間(秒単位)で割ることによって生成されます。数字は約50kから1000kの間です。だから私はawk '{print $1/1000}'を使って50 - 1000の範囲にインポートしました。
そして、カットオフ/しきい値として何を使用しようとしますか? a) $ratio の値、b) awk で生成された値、または c) numfmt 呼び出しの結果に基づいてフィルタリングしますか?
良い点は、numfmt呼び出しを使用してバイトをメガバイトに増やしたいということです。ところで、それが切られました。したがって、削除できます。目的の結果が出るまで機能します。
./file1.mp4: codec=h264
aac, size=54886926, duration=94.900000, ratio=578365.92
578.366
./file2.mp4: codec=vp9
aac, size=15147100, duration=108.159000, ratio=140044.74
140.045
./file3.mp4: codec=vp9
aac, size=22306731, duration=109.947000, ratio=202886.21
202.886
長さが長いので、エンコード/縮小できるビデオ/オーディオファイルを見つけるためにこれを使用します。したがって、高い $ratio をエンコードできます。この値はスクリプトで簡単に調整できますが、約200〜400です。コーデックの効率によって異なります(使用されているコーデックを表示するために行を追加しました)。
だから、最終的に要件を満たすファイルだけを含むテキストファイルを持っていると思います。この場合、設定された比率よりも大きい。私は経験に基づいて決定を下します。
メモ:可能であれば、読み取れず(破損などのため)値のないファイルをテキストファイルに追加すると良いと思います。
比率を200に設定したと仮定すると、上記の3つの例に基づいて、txtファイルには次のものが含まれます。
./file1.mp4: codec=h264
aac, size=54886926, duration=94.900000, ratio=578365.92
578.366
./file3.mp4: codec=vp9
aac, size=22306731, duration=109.947000, ratio=202886.21
202.886
どんな助けでも大変感謝します。
乾杯
ベストアンサー1
おそらく上部の近くでカットオフを宣言します。
# We only care about files with ratios GREATER than this:
cutoff=200000
その後、ループの下部付近で and コマンドをテストおよびステートメントにwhile
ラップします。echo
printf
if
...
ratio=$(bc <<< "scale=2; $size / $duration")
rc=$(bc <<< "$ratio > $cutoff")
if [[ "$rc" == "1" ]]
then {
echo "$file: codec=$codec, size=$size, duration=$duration, ratio=$ratio"
awk '{print $1/1000}' <<< "$ratio"
} | tee -a /home/user/Downloads/logfile
fi
done