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

Out*_*ack 4 linux shell

我已经找到了一些在类似情况下执行此操作的示例,但这是我编写的唯一一个shell脚本,除了逐字运行命令之外还执行任何操作,所以我很难将这些示例应用于我自己的情况并需要一些手 - 持有<3

我只是想从MP4批量翻录音频.这个脚本有效:

for f in *.mp4; 
    ffmpeg -i "$f" -f mp3 -ab 192000 -vn "mp3s/$f.mp3"
done
Run Code Online (Sandbox Code Playgroud)

但文件都以.mp4.mp3结尾.如何摆脱mp4部分?

mik*_*yra 11

如果你正在使用bash

${f%%.mp4}
Run Code Online (Sandbox Code Playgroud)

将给出没有.mp4扩展名的文件名.

尝试使用它像这样:

for f in *.mp4; do
    ffmpeg -i "$f" -f mp3 -ab 192000 -vn "mp3s/${f%%.mp4}.mp3"
done
Run Code Online (Sandbox Code Playgroud)

...并且不要忘记do给定示例中的关键字.

说明

bash手册(man bash)说明:

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

删除匹配的后缀模式.这个词被扩展为产生一个模式,就像路径名扩展一样.如果模式匹配参数的扩展值的尾部,则扩展的结果是参数的扩展值,其中%'' case) or the longest matching pattern (the删除了最短匹配模式(%%''case).如果参数是@或*,则模式删除操作依次应用于每个位置参数,并且扩展是结果列表.如果参数是使用@或*下标的数组变量,则模式删除操作依次应用于数组的每个成员,并且扩展是结果列表.

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

这也是bash手册中给出的章节标签.因此man bash /paramter exp应该快速带你到那儿.`