将.aiff转换为SoX中的.wav

问题描述:

我在.aiff格式的目录中有多个文件,并且我想使用SoX将它们转换为.wav。我曾尝试代码上this网站,这是如下将.aiff转换为SoX中的.wav

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; 

,但我得到了这两种情况下,指出错误消息“无法执行二进制文件”。什么可能是这个错误的来源?

不兼容的二进制文件导致此错误,see this question

如果file soxuname -a命令的输出指示二进制文件与操作系统(即x86与ARM)之间存在差异,则需要为SoX找到正确的二进制文件。虽然自2015年以来没有发布SoX,但请检查thisthis以查找与您的系统兼容的版本。

该问题也与sox的文件属性有关。为了赋予它可执行属性,只需转到sox所在的文件夹,然后运行chmod +x sox命令(首先需要root访问权限)。

+1

的'文件sox'输出是'Mach-O的64位可执行x86_64'和输出'uname -a'是'14.5.0 Darwin Kernel版本14.5.0:2017年4月11日星期二16:12:42 PDT; root:xnu-2782.50.9.2.3〜1/RELEASE_X86_64 x86_64'这些不兼容吗? (我不熟悉二进制文件)。感谢您的帮助。 – Lisa

+1

我不是Mac用户,不幸的是,我不熟悉它。不过,它们似乎都是64位的。你可以尝试用'su'命令切换到root用户并转到sox所在的目录,然后运行'chmod + x sox'?然后尝试再次运行它,最好使用'sudo sox',并具有root权限。此外,人们似乎也有类似的问题,所以你可能想尝试安装旧版本的sox,这可能是兼容的:https://*.com/questions/13499871/sox-sound-exchange-on- mac-ppc-10-4-installation-questions –

+1

这工作,但现在我收到语法错误。我想这应该是一个单独的问题。谢谢! – Lisa

您链接到的两个片段看起来有点粗略,我使用lsecho
echo -e可能实际上是给你的语法错误,因为OSX(BSD)echo没有-e选项。 (输入man echo进入终端即可看到)。

我冒昧地组建了一个替代性的单线,基于find及其-exec选项。

find -E . -maxdepth 1 -iregex '.*\.(aif|aiff)' -exec bash -c '$0 "$1" "${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

权在这里它变得有点复杂

  • '$0 "$1" "${1%.*}.wav"':这是bash的内部运行通话贝壳。 $0将展开至program name"$1"将展开为第一个(在这种情况下,仅限于)参数,如果使用空格,则使用双引号括起来。 "${1%.*}.wav"也将扩展到第一个参数,除了它将在strip away the last period and everything after之前,在最后标记'.wav'之前。有效替换文件扩展名。

  • sox {}:这些是传递给shell调用的参数。第一个(sox)是我们要使用的程序,在呼叫中称为$0。第二({})是什么文件find发现,壳呼叫

这是相当拗口内被称为$1和我不是专家,所以有可能是在我所一些错误书面的,但大纲应该是坚实的。

*这是OSX具体,不那么漂亮,但更便携的选择是:

find . -maxdepth 1 \(-iname "*.aif" -o -iname "*.aiff" \) -exec bash -c '$0 "$1" "${1%.*}.wav"' sox {} \;