bash中的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

尝试以下操作:

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多个模式(globs)一起使用,如下所示:*.m4a *.webm将扩展到for迭代的单个令牌列表。

    • 您可能希望在循环之前添加shopt -s nullglob,以便在没有匹配文件的情况下,不会使用未展开模式输入
  • ${i%.*}.mp3使用参数扩展(具体地说,%用于删除最短后缀)从文件名中删除任何现有的扩展名,然后附加.mp3

请注意,上面的技术使用模式,而不是正则表达式。虽然亲缘关系遥远,但存在根本差异;模式更简单,但更有限;请参阅模式匹配。

p.S.:您可以将converted=$((converted + 1))简化为(( ++converted ))

最新更新