在bash for循环中没有扩展名的文件名

在这样一个for循环中:

for f in `ls *.avi`; do echo $f; ffmpeg -i $f $f.mp3; done 

$ f将是完整的文件名,包括扩展名。 例如,对于song1.avi,命令的输出将是song1.avi.mp3。 有没有办法只得到歌1,没有从for循环的.avi?

我想用awk或其他工具可以做到这一点,但我希望有更直接的东西。

谢谢

使用bash参数扩展

 ${f%%.*} 

请注意,您需要贪婪版本,因为文件名中有多个点。

从bash手册:

$ {参数%字}

$ {参数%%词}

这个词被扩展为产生一个模式,就像在文件名扩展。 如果模式匹配参数扩展值的尾部分,则扩展结果是匹配模式最短的参数值('%'情况)或最长匹配模式('%%'情况)删除。 如果参数是“@”或“ ”,模式删除操作依次应用于每个位置参数,扩展是结果列表。 如果参数是一个以'@'或' '为下标的数组variables ,则模式移除操作将依次应用于数组的每个成员,而扩展则是结果列表。

这应该做到这一点:

 for i in *.m4a; do ffmpeg -i $i ${i%%.*}.mp3 done