bash - 使用 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 "$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.wav
sox
在所有*.wav
文件上运行,"${0##*/}
从路径名中删除文件名。
推荐阅读
- css -
坚持与滚动文本不同的行
- javascript - 在 HTML 和 JavaScript 中添加两种不同类型的滑块
- tfs - TFS 2017.3:部署批准者页面自定义
- wcf - 如何在 WCF 服务中将 Action 设为空白,因为客户端需要空白 SoapAction=""?
- react-day-picker - 在标题中仅显示月份
- angular - 角度 ngIf 不显示在组件中实现的 div
- python - 为什么我的用户模型在 django admin 中没有以正确的名称和字段出现
- laravel - 按计数对 Laravel Nova 分区结果进行排序
- vba - 使用字符串比较打开特定文件
- python-3.x - 如何为单个绘图实例创建两个图例对象?