我在一个文件夹中有一堆媒体(准确地说是视频),我想总结所有长度。我现在将忽略几秒和几小时,只是为了了解其要点。我写了这个脚本:
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
可以同时完成grep
和cut
的工作以及求和,因此如果exiftool
无法自行进行计算,您仍然可以简化它:
exiftool -q -n -Duration ./*(-.) | awk -F: '{sum += $2}; END{print sum/60}'
总持续时间(以分钟为单位)。