명령줄을 사용하여 여러 mp3의 누적 재생 시간을 찾는 방법은 무엇입니까?

명령줄을 사용하여 여러 mp3의 누적 재생 시간을 찾는 방법은 무엇입니까?

나는 많은 mp3 파일이 포함된 디렉토리를 가지고 있으며 그 누적 기간을 쉽게 찾을 수 있는 방법이 필요합니다. 파일의 지속 시간을 찾을 수 있다는 것을 알고 있습니다

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

나는 또한 다음을 사용하여 디렉토리의 모든 mp3 파일에 대해 이 명령을 실행할 수 있다는 것을 알고 있습니다.

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

이것은 약간 필터링될 수 있습니다.

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

하지만 이 모든 것을 어떻게 요약할까요? 사용할 ffmpeg필요는 없습니다. 출력 형식도 그다지 중요하지 않습니다. 초 또는 mm:ss 또는 이와 유사한 것이 작동합니다. 나는 그것이 다음과 같이 보이기를 원합니다 :

$ <command>
84:33

답변1

정확히 기간을 초 단위로 얻은 다음 이를 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

이 숫자를 HH:MM:SS 형식으로 직접 변환하세요. 예를 들어https://stackoverflow.com/a/12199816/6481121

답변2

Ipors Sicer의 답변완벽하게 작동합니다. 그의 대답을 보완하기 위해 점 뒤의 모든 것을 제거하고이 답변약간만 수정하면 다음을 얻을 수 있습니다.

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))

나는 다음과 같은 결과를 얻었습니다.

87:2

관련 정보