计算音乐收藏的总小时数

・2 分钟阅读

 $ find . -print0 | xargs -0 -P 40 -n 1 sh -c 'ffmpeg -i "$1" 2>&1 | grep "Duration:" | cut -d " " -f 4 | sed "s/.$//" | tr "." ":"' - | awk -F ':' '{ sum1+=$1; sum2+=$2; sum3+=$3; sum4+=$4; if (sum4 > 100) { sum3+=1; sum4=0 }; if (sum3 > 60) { sum2+=1; sum3=0 }; if (sum2 > 60) { sum1+=1; sum2=0 } if (NR % 100 == 0) { printf "%.0f:%.0f:%.0f.%.0fn", sum1, sum2, sum3, sum4 } } END { printf "%.0f:%.0f:%.0f.%.0fn", sum1, sum2, sum3, sum4 }'

说明

首先,find命令查找当前目录(. )中的所有文件,这将通过管道传输到xargs,以便能够并行运行下一个shell管道。

xargs-P参数指定并行运行多少个进程,当持续时间读取的时间主要是IO绑定时,设置这个值比CPU内核的数量要高。

findxargs-print0-0参数分别用于正确处理带有空格或其他特殊字符的文件。

xargs由执行,以便为find找到的每个文件拥有shell管道,此管道提取持续时间并将它转换为容易被Awk解析的格式。

ffmpeg读取文件,并且打印大量关于它的信息,grep提取持续时间线,cutsed去掉了时间信息,tr.转换为:,使之更容易被Awk分割。

Awk是一个"模式定向扫描与处理语言",通常在shell脚本中用于简单的文本处理,在这里,我们使用它将时间元素拆分为4变量,并且添加它们,如果其中一个变量溢出(例如,每分钟不超过60秒下一个变量递增该变量重置为0每100行打印一次当前值最后再次打印。

限制

需要ffmpeg,一个流音频和视频处理工具。

Hujiuxiang profile image