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

时间:2013-03-05 21:35:36

标签: linux shell

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

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

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

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

2 个答案:

答案 0 :(得分:11)

如果你正在使用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 %%''案例)已删除。如果参数是@                 或*,模式去除操作依次应用于每个位置参数,并且扩展是结果                 名单。如果参数是使用@或下标的数组变量                 *,模式删除操作适用于每个成员                 依次是数组,扩展是结果列表。

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

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

答案 1 :(得分:0)

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

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