脚本运行 sox 将多个单声道组合成立体声

Dan*_*Dan 5 script command-line sox

我有一个装满.wav音频文件的文件夹。

有些是立体声,大多数是单声道拆分。

单声道分裂对都被命名foo bar track.L.wavfoo bar track.R.wav

我可以使用命令行工具sox将一对单声道组合成 1 个立体声轨道,如下所示:

sox -M track1.L.wav track1.R.wav track1.Stereo.wav
Run Code Online (Sandbox Code Playgroud)

其中前 2 个文件是单声道对,第三个是输出立体声文件。

这很棒,但我想要一个脚本,它会自动找到所有的单声道对并将它们组合成立体声文件。

即,我需要它来查找除扩展名.L..R.之前具有相同名称的所有文件,并sox在它们上运行,输出到具有相同名称但没有L/R后缀的新文件。

例如,如果我的文件夹包含这些文件:

track1.L.wav
track2.L.wav
track3.L.wav
track4.L.wav
track1.R.wav
track2.R.wav
track3.R.wav
track4.R.wav
track6.wav
track7.wav
Run Code Online (Sandbox Code Playgroud)

我需要运行这些命令:

sox -M track1.L.wav track1.R.wav track1.Stereo.wav
sox -M track2.L.wav track2.R.wav track2.Stereo.wav
sox -M track3.L.wav track3.R.wav track3.Stereo.wav
sox -M track4.L.wav track4.R.wav track4.Stereo.wav
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止的位置:

for file in ./*.L.wav;
do 
    file2=`echo $file | sed 's_\(.*\).L.wav_\1.R.wav_'`;
    out=`echo $file | sed 's_\(.*\).L.wav_\1.STEREO.wav_'`;
    echo $file - $file2 - $out;
done
Run Code Online (Sandbox Code Playgroud)

那行得通,但是当我echo

sox -M $file $file2 $out;
Run Code Online (Sandbox Code Playgroud)

它不起作用;文件名中的空格会导致它失败。

sla*_*art 5

从 GNU/Linux 控制台试试这个:

for file in ./*L*wav;
do
    for file2 in ./*R*wav;
    do
        $out = "Stereo"
        sox -M $file $file2 $file-$out.wav;
    done;
done
Run Code Online (Sandbox Code Playgroud)

注意:“./”代表文件所在的音乐目录。


Dan*_*Dan 3

根据sgmart的建议,我解决了:

for file1 in ./*.L.wav; do 
  file2=`echo $file1 | sed 's_\(.*\).L.wav_\1.R.wav_'`;
  out=`echo $file1 | sed 's_\(.*\).L.wav_\1.STEREO.wav_'`;
  sox -MS "$file1" "$file2" "$out";
  mv "$file1" mono; mv "$file2" mono;
done
Run Code Online (Sandbox Code Playgroud)

需要"围绕变量。

我添加了一些内容以将处理后的文件移动到“mono”子文件夹中。