4

我发现了一些在类似情况下执行此操作的示例,但这是我编写的唯一一个除了逐字运行命令之外还可以执行任何操作的 shell 脚本,因此我正在努力将这些示例应用于我自己的情况并需要一些帮助-持有<3

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

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

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

4

2 回答 2

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)指出:

${参数%word} ${参数%%word}

删除匹配的后缀模式。单词被扩展以产生一个模式,就像在路径名扩展中一样。如果模式匹配 parameter 扩展值的尾随部分,则扩展的结果是 parameter 的扩展值,其中最短匹配模式(%'' case) or the longest matching pattern (the%%'' 情况)被删除。如果参数是@或*,模式移除操作将依次应用于每个位置参数,扩展是结果列表。如果 parameter 是下标为 @ 或 * 的数组变量,模式移除操作将依次应用于数组的每个成员,展开是结果列表。

这只是您可以对 shell 变量执行的众多字符串操作之一。它们都以Parameter Expansion的名字命名。

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

于 2013-03-05T21:38:15.013 回答
0

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

find . -depth -name "*.c" -exec sh -c 'dname=$(dirname {}) && fname=$(basename {} .c) && mv {} $dname/$fname.h' ";"
于 2016-01-07T11:36:26.763 回答