ZSH:获取for循环的基本名称

时间:2016-04-17 16:08:14

标签: for-loop zsh

我试图获取基本名称(没有文件扩展名),以便我可以快速处理音频文件目录(.flac - > .m4a)并使用正确的文件名。

这样可行:

for i in *.flac;do ffmpeg -i $i -c:a libfdk_aac -vbr 3 $i.m4a; done

但它给我留下了像这样的文件: audiofile.flac.m4a

我想做的就是抓住" audiofile"文件名的一部分,以便它可以工作:

for i in *.flac;do ffmpeg -i $i.flac -c:a libfdk_aac -vbr 3 $i.m4a; done

但是我不理解修饰符(显然是":t"修饰符可能会得到结果?)或者如何在for循环中定义变量(对于每个文件)。另外,我看到有很多关于如何使用BASH执行此操作的示例,但我正在寻找适用于zsh的内容。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

zsh中,您可以将Modifiers from History ExpansionParameter Expansions一起使用。每个修饰符前面都有冒号:${name:modifier}. The r modifier removes the extension, i.e. everything from - including - the last。`到文件名的末尾:

for i in *.flac; do 
    ffmpeg -i $i -c:a libfdk_aac -vbr 3 ${i:r}.m4a
done

注意:修饰符r将删除任何扩展名,而不仅仅是“.flac”。

更具可移植性(读取:应该适用于任何符合POSIX标准的shell),具体的解决方案是使用参数扩展 ${name%pattern},它将删除匹配{{{1}的最小字符串。 1}}从pattern的值的末尾开始。如果namepattern的值末尾不匹配,则值将保持不变:

name

这将仅从文件名末尾删除“.flac”。