当前文件夹中所有媒体持续时间的总和

当前文件夹中所有媒体持续时间的总和

我在一个文件夹中有一堆媒体(准确地说是视频),我想总结所有长度。我现在将忽略几秒和几小时,只是为了了解其要点。我写了这个脚本:

sum=0
for file in *
do
curr=$(exiftool $file |
   grep -i "^Duration" |
   awk '{print $3}' |
   cut -d':' -f 2)
((sum = sum + curr))
done
echo $sum

但它真的很慢,我想知道是否可以以某种方式让它更快(或者改变它,我想知道你是否会以不同的方式做)。

其背后的逻辑非常简单,迭代目录中的每个文件,抓取带有持续时间的行,使用 awk 隔离时间 (hh:mm:ss) 格式,使用 ':' 作为分隔符进行剪切以隔离分钟。并将过程中的分钟数加在一起,然后打印总和。我用的zsh是记录。

答案1

您可以将其简化为:

exiftool -n -q -p '${Duration;$_ = ConvertDuration(our $total += $_)}' ./*(-.) |
   tail -n 1

(按照获取目录中视频文件的总时长,这里使用,*(-.)因为您正在使用zsh, 来限制常规文件或常规文件的符号链接)。

这里的持续时间是正确计算的,就像-n我们得到原始秒数一样,只有我们在求和后才进行奇特的格式化。

无论如何,缓慢的部分很可能主要归因于其exiftool自身。至少在这里,它只被调用一次,这应该会带来一些改进。

另请注意,awk可以同时完成grepcut的工作以及求和,因此如果exiftool无法自行进行计算,您仍然可以简化它:

exiftool -q -n -Duration ./*(-.) | awk -F: '{sum += $2}; END{print sum/60}'

总持续时间(以分钟为单位)。

相关内容