我想要一个 for 循环来遍历具有两个不同扩展名的文件

我想要一个 for 循环来遍历具有两个不同扩展名的文件

我希望以下循环遍历 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

答案1

要在 bash 中循环遍历多组文件,只需在 for 列表中指定它们即可。
如果不存在与组匹配的文件(例如没有 *.webm 文件),则为了仍然循环一次(使用组规范(* .webm)作为变量的值)。如果你想防止这种情况发生,你需要设置 nullglob 选项
shopt -s nullglob

要从文件名中删除扩展名(有扩展名!),请使用以下命令参数扩展${i%.*}

你的脚本将会像这样:

shopt -s nullglob
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

相关内容