I need to check the duration of a group of audio files. Is there a simple way to do this on the unix command-line?
> duration *
I have the a
If you are interested in finding total duration of wav files in a directory using soxi you can use this:
soxi -D input_dir/*.wav | python -c "import sys;print(sum(float(l) for l in sys.stdin))
change input_dir
according to your input directory.
If you want to find max/min duration between all wav files feel free to change sum
to max
or min
.
A solution based on mplayer from commandlinefu by syssyphus that works with both audio and video files:
sudo apt-get install mplayer
find -type f -name "*.mp3" -print0 | xargs -0 mplayer -vo dummy -ao dummy -identify 2>/dev/null | perl -nle '/ID_LENGTH=([0-9\.]+)/ && ($t +=$1) && printf "%02d:%02d:%02d\n",$t/3600,$t/60%60,$t%60' | tail -n 1
Get the total length of all video / audio in the current dir (and below) in H:m:s
Change the
*.mp3
to whatever you want to match (e.g.,*.avi
,*.wav
), you can remove it altogether if you want to check all files.
Example of output: 00:00:37
ffprobe your_file.mp3 2>&1 | grep "Duration"
The output looks like this:
Duration: 00:44:33.50, start: 0.011995, bitrate: 128 kb/
mediainfo can do this, but mediainfo is one of those useful tools that's so badly documented that you almost need to know how to use it in order to learn how to use it (happens a lot in the linux world).
After hours of trials and reading high and low, I finally got it to generate a recursive comma-separated list of file names and their duration in milliseconds.
cd to the starting directory and issue the following command:
find "$(pwd)" -type f -print0 | xargs -0 -I {} mediainfo --Inform="General;%CompleteName%,%Duration%" {} > list.txt
The results will be output to list.txt.
In addition to cdosborn's answer, to calculate the length of all .mp3
files recursively in subfolders of current directory and show the total sum result in days:hours:minutes:seconds
format:
In zsh:
afinfo **/*.mp3 | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}'
In bash or sh:
find . -name "*.mp3" -exec afinfo {} \; | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}'
The result is like this (7 days, 5 hours, 6 minutes, 58 seconds):
$ afinfo **/*.mp3 | awk '/estimated duration/ { print $3 }' | paste -sd+ - | bc | awk '{printf("%d:%02d:%02d:%02d\n",($1/60/60/24),($1/60/60%24),($1/60%60),($1%60))}'
7:05:06:58
$
on OSX
Print the length of each audio file in the current dir:
afinfo * | awk '/estimated duration/ { print $3 }'
Include the filepath:
afinfo * | awk '/File:/ { song=$2 } /estimated duration/ { print song, $3 }'