Como encontrar a duração acumulada em vários mp3 com a linha de comando?

1

Eu tenho um diretório com muitos arquivos mp3, e eu preciso de uma maneira simples de encontrar a duração acumulada para eles. Eu sei que posso encontrar a duração de um arquivo com

ffmpeg -i <file> 2>&1 | grep Duration

Eu também sei que posso executar este comando em todos os arquivos mp3 em um diretório com o comando

for file in *.mp3; do ffmpeg -i "$file" 2>&1 | grep Duration; done

Isso pode ser um pouco filtrado com

for file in *.mp3; do ffmpeg -i "$file" 2>&1 | grep Duration | cut -f4 -d ' '; done

Mas como faço para resumir tudo? Usando ffmpeg não é necessário. O formato de saída também não é tão importante. Segundos ou mm: ss ou algo similar serve. Eu gostaria que fosse algo assim:

$ <command>
84:33
    
por Broman 07.11.2018 / 16:09

2 respostas

2

Você pode obter exatamente a duração em segundos e, em seguida, somar com bc:

for file in *.mp3;do ffprobe -v error -select_streams a:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 "$file";done|paste -sd+|bc -l

Converta este número para o formato HH: MM: SS sozinho. por exemplo. link

    
por 07.11.2018 / 16:29
0

A resposta do Ipors Sicer funcionou perfeitamente. Para adicionar à sua resposta, eu tirei tudo após o ponto e usei esta resposta com uma pequena modificação para obter isso:

secs=$(for file in *.mp3;
    do ffprobe -v error -select_streams a:0 -show_entries stream=duration -of default=noprint_wrappers=1:nokey=1 "$file";
done | paste -sd+|bc -l|cut -f1 -d '.'); 
printf '%d:%d\n' $(($secs/60)) $(($secs%60))

E eu tenho esta saída:

87:2
    
por 07.11.2018 / 16:42