使用 sox 连接子文件夹中的文件

Concatenate files in subfolders with 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 等结尾

您可以尝试使用 find

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

  • 之外什么都不做
  • 如果您认为输出没问题,请删除echo,这样它就会实际转换文件。

简要说明。

  • -type d 表示 find 将只查找目录。

  • -exec 用于 call/invoke 一个 shell 来完成一个 shell 任务。

  • bash -O nullglob 以防万一没有文件,glob *.wav 不会展开。 (没有文件将添加到 array files

  • -c 执行 shell 命令

  • cd "[=21=]" && 进入每个目录 && 运行 如果前面的命令成功,则执行下一个命令。

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

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

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