我已经找到了一些在类似情况下执行此操作的示例,但这是我编写的唯一一个shell脚本除了逐字运行命令之外还执行任何操作,所以我很难将这些示例应用于我自己的情况和需要一些手持< 3
我只是想从MP4批量翻录音频。这个脚本有效:
for f in *.mp4;
ffmpeg -i "$f" -f mp3 -ab 192000 -vn "mp3s/$f.mp3"
done
但文件都以.mp4.mp3结尾。我该如何摆脱mp4部分?
答案 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' ";"