regex - bash 中的 for 循环遍历具有两个特定扩展名的文件

标签 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

最佳答案

尝试以下操作:

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/

相关文章:

linux - 使用 Bash 脚本将输入提供给命令行

linux - 显示两个目录之间的变化

.net - Intelligencia UrlRewriter 与 RegEx 无法正常工作

php - 正则表达式匹配已定义超文本的超链接

Javascript 正则表达式将给定字符串中的 'n' 相同连续字符减少为单个字符

linux - 在 kubuntu 启动时打开 shell 并运行脚本

bash - 如何通过命令行获取随机的32位十六进制字符串?

linux - 更改多个文件命令行

ios - swift 正则表达式 : Replace Lowercase Followed by Uppercase

Python 正则表达式 : finding sequence of chars inside a string