首页 > 解决方案 > 使用 sox 连接子文件夹中的文件

问题描述

我有一个包含我需要连接的 wav 文件的子文件夹的文件夹,导致每个文件夹有 1 个 wav 文件。

在每个单独的文件夹中,我可以使用 sox 来做:sox *.wav combined.wav但我有 1000 个文件夹。

我该怎么做:

a) 编写一个命令(使用 Mac 终端)来连接每个子文件夹的子文件夹中的所有文件?b) 确保生成的文件具有合适的名称,例如子文件夹的名称?

我试图在下面举例说明我的文件结构:

例如

音频文件

170

170_a.wav

170_b.wav

170_c.wav

170_d.wav

171

171_a.wav

171_b.wav

171_c.wav

171_d.wav

等等

我想以 170_combined.wav 和 171_combined.wav 等结尾。

标签: bashaudioterminalconcatenationsox

解决方案


您可以尝试使用find

find . -type d -exec bash -O nullglob -c 'cd "$0" && files=(*.wav) && ((${#files[@]})) && echo sox "${files[@]}" "${0##*/}_combined.wav"' {} \;
  • 除了将输出打印到stdout.

  • echo如果您认为输出正常,请删除,因此它实际上会转换文件。

简要说明。

  • -type d意味着 find 将仅查找目录。

  • -exec是使用所以我们可以调用/调用一个shell来做一个shell任务。

  • bash -O nullglob以防万一没有文件,全局*.wav不会扩展。(不会添加任何文件array files

  • -c执行一个shell命令

  • cd "$0" &&&&如果之前的命令成功,则进入每个目录运行下一个命令。

  • files=(*.wav) &&*.wav创建文件数组

  • ((${#files[@]}))如果数组不为空(有*.wav文件)

  • sox "${files[@]}" "${0##*/}_combined.wavsox在所有*.wav文件上运行,"${0##*/}从路径名中删除文件名。


推荐阅读