如何在Linux shell脚本中更改文件扩展名?

4

我发现在类似情况下有些做法的示例,但这是我写过的唯一一个除了运行命令之外还能做点别的事情的shell脚本,所以我很难把这些示例应用到我的情况中,并需要一些操作指导<3

我只是试图批量从MP4文件中提取音频。这个脚本是可以工作的:

for f in *.mp4; 
    ffmpeg -i "$f" -f mp3 -ab 192000 -vn "mp3s/$f.mp3"
done

但是所有的文件都以.mp4.mp3结尾。我该如何去掉mp4这部分?
2个回答

12
如果您正在使用bash
${f%%.mp4}

将会返回不带 .mp4 扩展名的文件名。
可以像这样使用它:
for f in *.mp4; do
    ffmpeg -i "$f" -f mp3 -ab 192000 -vn "mp3s/${f%%.mp4}.mp3"
done

...不要忘记在给定的示例中使用do关键字。

解释

bash手册(man bash)中写道:

${parameter%word} ${parameter%%word}

删除匹配的后缀模式。 单词被扩展以产生 一个与路径名扩展中一样的模式。如果该模式匹配参数的扩展值的尾部部分,则扩展的结果是参数的扩展值,其中最短的匹配模式( %'' case) 或最长的匹配模式 (the%%'' case) 被删除。如果参数是 @ 或 *,则对每个位置参数应用模式移除操作,并且扩展是结果 列表。如果参数是带有@或*下标的数组变量,则将模式删除操作应用于数组的每个成员,扩展是结果列表。

这只是您可以对shell变量执行的许多字符串操作之一。它们都被称为参数扩展

这也是bash手册中给出的章节标签。因此,man bash/paramter exp应该能够快速带您到达那里。


这正是我所需要的,它运行得很好,谢谢!但如果您不介意,能否简要描述一下 ${f%%.mp4} 的含义或称之为何种操作,以便我可以查找?一旦允许,我将立即接受答案。 - Outback
根据您的反馈,我已经在我的帖子中添加了解释。正如我之前所述,参数扩展是您可能想要在bash手册中查找的术语。 - mikyra

0

以下命令可用于更改当前目录下所有文件的文件扩展名。

find . -depth -name "*.c" -exec sh -c 'dname=$(dirname {}) && fname=$(basename {} .c) && mv {} $dname/$fname.h' ";"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接