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

我发现了一些类似的情况,但是这是我写的唯一一个除了运行命令之外什么也不做的shell脚本,所以我很努力地将这些例子应用到我自己的情况中,持有<3

我只是试图从MP4批量翻录audio。 这个脚本的作品:

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

但是这些文件都以.mp4.mp3结尾。 我怎样才能摆脱mp4的一部分?

Solutions Collecting From Web of "如何更改Linux shell脚本中的文件扩展名?"

如果你使用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) or the longest matching pattern (the %%'case )删除。 如果参数是@或*,则将模式删除操作依次应用于每个位置参数,扩展是结果列表。 如果参数是以@或*为下标的数组变量,则将模式删除操作依次应用于数组的每个成员,并且扩展是结果列表。

这只是可以在shell变量上执行的许多字符串操作之一。 他们都以参数扩展的名字。

这也是在bash手册中给出的部分标签。 因此, man bash /参数exp应该带你到那里很快。 `

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

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