bash中的for循环通过具有两个特定扩展名的文件

时间:2015-12-20 14:34:29

标签: regex bash

我想要以下循环来浏览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 个答案:

答案 0 :(得分:5)

尝试以下方法:

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将扩展为{{1}的单个令牌列表迭代。

    • 您可能希望在循环之前添加for,以便在没有匹配文件的情况下使用未展开的模式输入。
  • shopt -s nullglob使用parameter expansion - 具体而言,${i%.*}.mp3用于删除最短后缀 - 从文件名中删除任何现有扩展名,然后附加%。< / p>

请注意,上述技术使用模式,而不是正则表达式。虽然有很大关系,但存在根本差异;模式更简单,但更有限;见pattern matching

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

相关问题