使用 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##*/}
从路径名中删除文件名。
我有一个文件夹,其中包含我需要连接的 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##*/}
从路径名中删除文件名。