我试图获取基本名称(没有文件扩展名),以便我可以快速处理音频文件目录(.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的内容。
有什么想法吗?
谢谢!
答案 0 :(得分:1)
在zsh
中,您可以将Modifiers from History Expansion与Parameter 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
的值的末尾开始。如果name
与pattern
的值末尾不匹配,则值将保持不变:
name
这将仅从文件名末尾删除“.flac”。