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