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

时间:2011-08-19 08:58:12

标签: bash

在像这样的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或其他类似的工具,但我希望有更直接的东西。

由于

2 个答案:

答案 0 :(得分:70)

使用bash参数扩展

${f%%.*}

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

来自bash手册:

  

<强> $ {参数%字}

     

<强> $ {参数%%字}

     

这个词被扩展为产生一个模式,就像文件名扩展一样。如果模式匹配参数展开值的尾部,那么展开的结果是具有最短匹配模式('%'大小写)或最长匹配模式('%%'大小写)的参数值删除。如果参数是'@'或'',则模式删除操作依次应用于每个位置参数,并且扩展是结果列表。如果参数是使用'@'或''下标的数组变量,则模式删除操作依次应用于数组的每个成员,并且扩展是结果列表。

答案 1 :(得分:15)

这应该这样做:

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