For loop ZSH:获取for循环的basename

For loop ZSH:获取for循环的basename,for-loop,zsh,For Loop,Zsh,我正在尝试获取没有文件扩展名的basename,以便快速处理音频文件目录.flac->.m4a,并使用正确的文件名 所以这是可行的: for i in *.flac;do ffmpeg -i $i -c:a libfdk_aac -vbr 3 $i.m4a; done 但它给我留下了这样一个文件: audiofile.flac.m4a 我想做的就是抓取文件名的音频文件部分,这样就可以: for i in *.flac;do ffmpeg -i $i.flac -c:a libfdk_aac -

我正在尝试获取没有文件扩展名的basename,以便快速处理音频文件目录.flac->.m4a,并使用正确的文件名

所以这是可行的:

for i in *.flac;do ffmpeg -i $i -c:a libfdk_aac -vbr 3 $i.m4a; done
但它给我留下了这样一个文件: audiofile.flac.m4a

我想做的就是抓取文件名的音频文件部分,这样就可以:

for i in *.flac;do ffmpeg -i $i.flac -c:a libfdk_aac -vbr 3 $i.m4a; done
但我不明白修饰符a:t修饰符可能会得到结果?或者如何在for循环中为每个文件定义变量。另外,我看到有很多关于如何使用BASH实现这一点的例子,但是我正在寻找一些可以使用zsh的东西

有什么想法吗

谢谢

在zsh中,您可以使用with。每个修饰符前面都有一个冒号:${name:modifier}。Thermodifier删除扩展名,即从-包括-last.`到文件名末尾的所有内容:

for i in *.flac; do 
    ffmpeg -i $i -c:a libfdk_aac -vbr 3 ${i:r}.m4a
done
注意:修饰符r将删除所有扩展,而不仅仅是.flac

一个更可移植的read:应该适用于任何符合POSIX的shell,具体的解决方案是使用参数扩展${name%pattern},它将从name值的末尾删除最小的字符串匹配模式。如果模式与name值的结尾不匹配,则返回的值将保持不变:

for i in *.flac; do
    ffmpeg -i $i -c:a libfdk_aac -vbr 3 ${i%.flac}.m4a
done
这将仅从文件名末尾删除.flac。

在zsh中,您可以使用with。每个修饰符前面都有一个冒号:${name:modifier}。Thermodifier删除扩展名,即从-包括-last.`到文件名末尾的所有内容:

for i in *.flac; do 
    ffmpeg -i $i -c:a libfdk_aac -vbr 3 ${i:r}.m4a
done
注意:修饰符r将删除所有扩展,而不仅仅是.flac

一个更可移植的read:应该适用于任何符合POSIX的shell,具体的解决方案是使用参数扩展${name%pattern},它将从name值的末尾删除最小的字符串匹配模式。如果模式与name值的结尾不匹配,则返回的值将保持不变:

for i in *.flac; do
    ffmpeg -i $i -c:a libfdk_aac -vbr 3 ${i%.flac}.m4a
done
这将仅从文件名末尾删除.flac