在像这样的for循环中:
for f in `ls *.avi`; do echo $f; ffmpeg -i $f $f.mp3; done
$ f将是完整的文件名,包括扩展名。例如,对于song1.avi,命令的输出将是song1.avi.mp3。有没有办法只获得song1,而没有来自for循环的.avi?
我想有办法使用awk或其他类似的工具,但我希望有更直接的东西。
由于
答案 0 :(得分:70)
使用bash参数扩展
${f%%.*}
请注意,您需要贪婪版本,因为文件名中有多个点。
来自bash手册:
<强> $ {参数%字} 强>
<强> $ {参数%%字} 强>
这个词被扩展为产生一个模式,就像文件名扩展一样。如果模式匹配参数展开值的尾部,那么展开的结果是具有最短匹配模式('%'大小写)或最长匹配模式('%%'大小写)的参数值删除。如果参数是'@'或'',则模式删除操作依次应用于每个位置参数,并且扩展是结果列表。如果参数是使用'@'或''下标的数组变量,则模式删除操作依次应用于数组的每个成员,并且扩展是结果列表。
答案 1 :(得分:15)
这应该这样做:
for i in *.m4a; do
ffmpeg -i $i ${i%%.*}.mp3
done