File name without extension in bash for loop
BashBash Problem Overview
In a for loop like this one:
for f in `ls *.avi`; do echo $f; ffmpeg -i $f $f.mp3; done
$f will be the complete filename, including the extension. For example, for song1.avi the output of the command will be song1.avi.mp3. Is there a way to get only song1, without the .avi from the for loop?
I imagine there are ways to do that using awk or other such tools, but I'm hoping there's something more straight forward.
Thanks
Bash Solutions
Solution 1 - Bash
Use bash parameter expansion
${f%%.*}
Note that you need the greedy version because there are multiple dots in the file name.
From bash manual:
> ${parameter%word} > > ${parameter%%word} > > The word is expanded to produce a pattern just as in filename expansion. If the pattern matches a trailing portion of the expanded value of parameter, then the result of the expansion is the value of parameter with the shortest matching pattern (the ‘%’ case) or the longest matching pattern (the ‘%%’ case) deleted. If parameter is ‘@’ or ‘’, the pattern removal operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter is an array variable subscripted with ‘@’ or ‘’, the pattern removal operation is applied to each member of the array in turn, and the expansion is the resultant list.
Solution 2 - Bash
This should do it:
for i in *.m4a; do
ffmpeg -i $i ${i%%.*}.mp3
done