在 SoX 中将 .aiff 转换为 .wav
Converting .aiff to .wav in SoX
我在一个目录中有多个 .aiff 格式的文件,我想使用 SoX 将它们转换为 .wav。我试过this网站上的代码,如下
theFiles = `/Users/me/RainbowAiff/*.aiff`;
for eachFile in $theFiles; do v1=${eachFile%*.aiff};
oldFile="$v1.aiff"; newFile = "$v1.wav";
echo oldFile $oldFile; echo newFile $newFile; sox $oldFile $newFile; done
和this网站,如下
for i in `/Users/me/RainbowAiff/ *.aiff`; do echo -e "$i"; sox $i $i.wav; echo -e "$i.wav"; done;
但是我在这两种情况下都收到一条错误消息 "cannot execute binary file"。此错误的来源可能是什么?
不兼容的二进制文件导致此错误,see this question。
如果 file sox
和 uname -a
命令的输出表明二进制文件与您的操作系统之间存在差异,即 x86 与 ARM,您需要找到正确的二进制文件对于 SoX。尽管自 2015 年以来没有 SoX 版本,请检查 this and this 以找到与您的系统兼容的版本。
这个问题也和sox的文件属性有关。为了赋予它可执行属性,只需转到 sox 所在的文件夹和 运行 chmod +x sox
命令(您首先需要 root 访问权限)。
你链接到的两个片段在我看来有点粗略,因为它们使用了 ls
和 echo
。
echo -e
实际上可能是导致语法错误的原因,因为 OSX (BSD) echo
没有 -e
选项。 (在终端中输入 man echo
以查看)。
我根据 find
及其 -exec
选项自由组装了另一种单线。
find -E . -maxdepth 1 -iregex '.*\.(aif|aiff)' -exec bash -c '[=10=] "" "${1%.*}.wav"' sox {} \;
解释一下:
find
: 可以找到任何东西
-E
: 启用 extended regex*
.
:从当前工作目录开始。可以换成相对或绝对路径
-maxdepth 1
:只在第一个目录层查找。将 1 替换为 2 也可以在文件夹中查找文件,用 3 也可以在文件夹中的文件夹中查找文件……
删除此选项将启用完全递归(一直向下查找文件)
-iregex
:使用不区分大小写的正则表达式
'.*\.(aif|aiff)'
:匹配以任意长度 (*
) 开头的任何内容 (.
),后跟句点 (\.
) 和字符串 'aif' 或 'aiff'(或 'AIF'、'AIFF'、'aiFF' …)((aif|aiff)
)
-exec bash -c
: 在非交互式 bash shell
中执行以下
这里有点复杂
'[=31=] "" "${1%.*}.wav"'
:这是在bashshell中调用运行。 [=32=]
将扩展到 program name. ""
will expand to the first (and in this case, only) argument, enclosed in double quotes in case of white-spaces. "${1%.*}.wav"
will also expand to the first argument, except it will strip away the last period and everything after,然后在末尾标记“.wav”。有效地替换文件扩展名。
sox {}
:这些是传递给 shell 调用的参数。第一个 (sox
) 是我们要使用的程序,在调用中称为 [=32=]
。第二个 ({}
) 是 find
找到的任何文件,在 shell 调用
中称为 </code>
</ul>
<p>说的有点啰嗦,我也不是专家,所以我写的可能会有一些错误,但大纲应该是可靠的。</p>
<p><sub>*这是 OSX 具体的,不太漂亮但更便携的选项是:</sub></p>
<pre><code>find . -maxdepth 1 \( -iname "*.aif" -o -iname "*.aiff" \) -exec bash -c '[=11=] "" "${1%.*}.wav"' sox {} \;
我在一个目录中有多个 .aiff 格式的文件,我想使用 SoX 将它们转换为 .wav。我试过this网站上的代码,如下
theFiles = `/Users/me/RainbowAiff/*.aiff`;
for eachFile in $theFiles; do v1=${eachFile%*.aiff};
oldFile="$v1.aiff"; newFile = "$v1.wav";
echo oldFile $oldFile; echo newFile $newFile; sox $oldFile $newFile; done
和this网站,如下
for i in `/Users/me/RainbowAiff/ *.aiff`; do echo -e "$i"; sox $i $i.wav; echo -e "$i.wav"; done;
但是我在这两种情况下都收到一条错误消息 "cannot execute binary file"。此错误的来源可能是什么?
不兼容的二进制文件导致此错误,see this question。
如果 file sox
和 uname -a
命令的输出表明二进制文件与您的操作系统之间存在差异,即 x86 与 ARM,您需要找到正确的二进制文件对于 SoX。尽管自 2015 年以来没有 SoX 版本,请检查 this and this 以找到与您的系统兼容的版本。
这个问题也和sox的文件属性有关。为了赋予它可执行属性,只需转到 sox 所在的文件夹和 运行 chmod +x sox
命令(您首先需要 root 访问权限)。
你链接到的两个片段在我看来有点粗略,因为它们使用了 ls
和 echo
。
echo -e
实际上可能是导致语法错误的原因,因为 OSX (BSD) echo
没有 -e
选项。 (在终端中输入 man echo
以查看)。
我根据 find
及其 -exec
选项自由组装了另一种单线。
find -E . -maxdepth 1 -iregex '.*\.(aif|aiff)' -exec bash -c '[=10=] "" "${1%.*}.wav"' sox {} \;
解释一下:
find
: 可以找到任何东西-E
: 启用 extended regex*.
:从当前工作目录开始。可以换成相对或绝对路径-maxdepth 1
:只在第一个目录层查找。将 1 替换为 2 也可以在文件夹中查找文件,用 3 也可以在文件夹中的文件夹中查找文件……
删除此选项将启用完全递归(一直向下查找文件)-iregex
:使用不区分大小写的正则表达式'.*\.(aif|aiff)'
:匹配以任意长度 (*
) 开头的任何内容 (.
),后跟句点 (\.
) 和字符串 'aif' 或 'aiff'(或 'AIF'、'AIFF'、'aiFF' …)((aif|aiff)
)-exec bash -c
: 在非交互式 bash shell 中执行以下
这里有点复杂
'[=31=] "" "${1%.*}.wav"'
:这是在bashshell中调用运行。[=32=]
将扩展到 program name.""
will expand to the first (and in this case, only) argument, enclosed in double quotes in case of white-spaces."${1%.*}.wav"
will also expand to the first argument, except it will strip away the last period and everything after,然后在末尾标记“.wav”。有效地替换文件扩展名。sox {}
:这些是传递给 shell 调用的参数。第一个 (sox
) 是我们要使用的程序,在调用中称为[=32=]
。第二个 ({}
) 是find
找到的任何文件,在 shell 调用 中称为
</code>
</ul>
<p>说的有点啰嗦,我也不是专家,所以我写的可能会有一些错误,但大纲应该是可靠的。</p>
<p><sub>*这是 OSX 具体的,不太漂亮但更便携的选项是:</sub></p>
<pre><code>find . -maxdepth 1 \( -iname "*.aif" -o -iname "*.aiff" \) -exec bash -c '[=11=] "" "${1%.*}.wav"' sox {} \;