我希望以下循环遍历 m4a 文件和 webm 文件。目前我使用了两个不同的循环,另一个只是替换了这个循环中的所有 m4a。此外,如果 ffmpeg 输出的文件是 m4a 文件,则应删除 m4a 扩展名,如果是 webm 文件,则应删除 webm 扩展名。并将其替换为 mp3。 (就像这里对 m4a 所做的那样)。我不知道该怎么做,我认为它与正则表达式有关,但我不知道如何真正使用它们,也没有找到好的教程/文档,所以如果你有,也请链接它.
for i in *.m4a ; do
echo "Converting file $converted / $numfiles : $i"
ffmpeg -hide_banner -loglevel fatal -i "$i" "./mp3/${i/.m4a}.mp3"
mv "$i" ./done
converted=$((converted + 1))
done
最佳答案
尝试以下操作:
for i in *.m4a *.webm; do
echo "Converting file $converted / $numfiles : $i"
ffmpeg -hide_banner -loglevel fatal -i "$i" "./mp3/${i%.*}.mp3"
mv "$i" ./done
converted=$((converted + 1))
done
您可以将
for
与多个 模式(glob)一起使用,如下所示:*.m4a *.webm
将扩展到for
迭代的单个标记列表。- 您可能希望在循环之前添加
shopt -s nullglob
,这样在没有匹配文件的情况下,它不会以未扩展 模式输入。
- 您可能希望在循环之前添加
${i%.*}.mp3
使用 parameter expansion - 具体来说,%
用于最短后缀删除 - 从文件名中删除任何现有扩展名,然后附加.mp3
。
请注意,上述技术使用的是模式,而不是正则表达式。虽然关系很远,但有根本的区别;模式更简单,但限制更多;见pattern matching .
附注:您可以将 converted=$((converted + 1))
简化为 ((++converted ))
。
关于regex - bash 中的 for 循环遍历具有两个特定扩展名的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34382072/