我发现在类似情况下有些做法的示例,但这是我写过的唯一一个除了运行命令之外还能做点别的事情的shell脚本,所以我很难把这些示例应用到我的情况中,并需要一些操作指导<3
我只是试图批量从MP4文件中提取音频。这个脚本是可以工作的:
for f in *.mp4;
ffmpeg -i "$f" -f mp3 -ab 192000 -vn "mp3s/$f.mp3"
done
但是所有的文件都以.mp4.mp3结尾。我该如何去掉mp4这部分?
${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应该能够快速带您到达那里。
以下命令可用于更改当前目录下所有文件的文件扩展名。
find . -depth -name "*.c" -exec sh -c 'dname=$(dirname {}) && fname=$(basename {} .c) && mv {} $dname/$fname.h' ";"