有人可以帮我完成 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
任何帮助将不胜感激。
干杯