Linux下如何为所有WAV文件批量执行sox命令?
解决办法:将find结果作为sox的输入输出参数
嗨,这个需求其实有几种实用的实现方式,我来给你详细说明:
1. 用find自带的-exec选项(最推荐)
find命令本身就支持对找到的每个文件执行指定命令,这是最直接且可靠的方式,不需要额外的管道工具:
find . -name '*.wav' -exec sox {} {} \;
{}是find的占位符,代表当前找到的WAV文件的完整路径\;表示对每个找到的文件单独执行一次sox命令
2. 用xargs传递参数
如果你更习惯用管道的方式,xargs可以帮你把find的输出转换成sox的参数:
find . -name '*.wav' | xargs -I {} sox {} {}
-I {}指定用{}作为占位符,替换成每个WAV文件的路径- 这种方式和
find -exec效果类似,但需要注意xargs对特殊字符(比如文件名含空格)的处理,不过find默认输出的文件名是正确分隔的,所以一般没问题
🔥 重要警告!绝对不要直接用同一个文件作为sox的输入和输出!
上面的命令看起来符合你的需求,但sox不允许直接将输入文件和输出文件设为同一个——因为sox会先清空输出文件,导致输入文件被损坏,数据直接丢失!
如果你的实际需求是对原文件进行音频处理(比如调整采样率、降噪、改变格式等),正确的做法是先输出到临时文件,再替换原文件,比如:
find . -name '*.wav' -exec sh -c ' sox "$1" "$1.tmp" [你的sox处理参数] mv "$1.tmp" "$1" ' _ {} \;
把[你的sox处理参数]替换成实际需要的选项(比如-r 16000设置采样率为16kHz),这样既完成了处理,又不会损坏原文件。
内容的提问来源于stack exchange,提问作者UrmLmn
相关产品推荐
相关产品推荐

