我有一个很大的目录,其中包含各种音频文件,mp3、ogg、opus、m4a 以及可能的其他文件。
我想获得所有这些文件的总长度。如果只是少量文件,我会将它们全部复制到另一个文件夹中并使用mp3info
,但它有几百 GB,所以这不是一个选择。
我认为我不能按mp3info
原样在我的用例中使用,因为我找不到递归搜索的选项。mp3info2
似乎有一个递归选项,-R
但我找不到很多信息,mp3info2
所以我不确定如何使用它。
我试过这个
tot=0; while read -r i; do tmp=0; tmp=`ffprobe "$i" -show_format 2>/dev/null | grep "^duration" | cut -d '=' -f 2 | cut -d '.' -f 1`; if [ -n "$tmp" ]; then let tot+=$tmp; fi; done < <(find . -type f -iname "*[.mp3,.wav,.m3u,.m4a,.m4b,.mpga,.opus,.opus]"); echo "Total duration: $(($tot/60)) minutes"
但得到
bash: let: tot+=N/A: division by 0 (error token is "A")
bash: let: tot+=N/A: division by 0 (error token is "A")
bash: let: tot+=N/A: division by 0 (error token is "A")
bash: let: tot+=N/A: division by 0 (error token is "A")
重复。
我尝试过soxi -D *.mp3
,然后会执行不同的文件类型,但得到这个
soxi FAIL formats: can't open input file `*.mp3': No such file or directory
目录格式为信件/作者/书名,例如K/King, Stephen/The Stand/The Stand.mp3
作为一个额外的问题:我如何对视频文件(在不同的目录中)做同样的事情
谢谢
这很可能是因为您
find
会发现很多不是多媒体文件的文件。当遇到这样的文件时,ffprobe
可能会输出类似这样的内容:正如你所看到的,
duration
就在这里N/A
。find
命令。可以在之间使用多个-iname
s with-o
(or) ,或者在您支持的情况下使用-regex
s 来代替。iname
find
N/A
通过检查您是否获得了返回的号码,可以使检查更安全。例子:
另一种方法是将所有持续时间(包括亚秒部分)收集到一个数组中,然后形成一个传递给的算术表达式
bc
: