【问题标题】:Concatenate files in subfolders with sox使用 sox 连接子文件夹中的文件
【发布时间】:2020-04-15 10:49:30
【问题描述】:

我有一个文件夹,其中包含我需要连接的 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 等结尾。

【问题讨论】:

  • 如果你运行sox *.wav combined.wav会自动重命名为170_combined.wav或者你需要添加前缀170_
  • 如果没有指定其他内容,它只会将文件命名为“combined.wav”。

标签: bash audio terminal concatenation sox


【解决方案1】:

您可以尝试使用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 以防万一没有文件,glob *.wav 不会扩展。 (不会向arrayfiles添加文件)

  • -c执行一个shell命令

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2015-12-14
    • 2021-07-05
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多