【问题标题】:How can I operate on pairs of like-named files with known suffixes? [duplicate]如何对具有已知后缀的同名文件对进行操作? [复制]
【发布时间】:2017-09-25 21:08:41
【问题描述】:

我正在尝试在 Mac 终端中使用 bash shell 批处理大量文件。该脚本将使用 SoX Sound Exchange 库和 @ 987654323@(用于混合)命令。我已经能够将 2 个单独文件的简单组合组合在一起,如下所示:

sox −m file1.wav file2.wav mixed.wav

上面的工作就像一个魅力,只是输出正确的结果。

但是,在编写批处理脚本时,要获取要合并的文件夹中的所有文件,我遇到了麻烦。首先,我的文件命名如下:

af01-sweep1.wav
af01-sweep2.wav
af02-sweep1.wav
af02-sweep2.wav
af03-sweep1.wav
af03-sweep2.wav

……等等……

这是脚本:

for file in ./*sweep1*
do
for file2 in ./*sweep2*
   do
       out=COMBINED
       sox -V4 -m -v 1 $file -v 1 $file2 $file-$out.wav
   done
done

这个脚本的结果是它将每个文件与标记“sweep1”与每个文件包含“扫2”。我只需要将前 af01-sweep1.wavaf01-sweep2.wav 结合起来,依此类推。我不知道在这里放什么命令或符号来告诉 bash 寻找相同的名称,但有“sweep1”和“sweep2”的区别。我有数千个文件,所以制作一个处理情侣的脚本至关重要。

我已经阅读了有关 bash 解决方案的信息,发现了一些名为 -NAME 的东西,并相信它可以与 MATCHFIND 等命令一起使用。不确定,因为我不正常编程。

【问题讨论】:

  • Looping over pairs of files 中的一些答案非常相关,尽管问题本身并不是 100% 正确。在提出新问题之前,您是否尝试过搜索重复项?
  • 顺便说一句,$file1"$file1" 不同。有时它可能看起来很有效,但是当您获得更有趣的文件名(即带有空格或 glob 的名称)时,它可能会严重失败。在所有扩展中使用引号;考虑通过shellcheck.net运行代码

标签: bash shell terminal sox


【解决方案1】:
for f1 in *-sweep1.wav; do
  prefix=${f1%-sweep1.wav}
  f2=${prefix}-sweep2.wav
  fout=${prefix}-mixed.wav
  [[ -e $f2 ]]   || { echo "Could not find $f2; skipping $f1" >&2; continue; }
  [[ -e $fout ]] && { echo "$fout already exists; skipping $f1" >&2; continue; }
  sox -V4 -m -v 1 "$f1" -v 1 "$f2" "$fout" 
done

【讨论】:

  • (社区 Wiki 以避免从回答已知的欺骗中获取代表)。
  • 这对我来说很完美。我可以在“sweep1”和“sweep2”前面使用任何名称,它每次都有效,结果正确。 SoX 中的详细模式表示格式正确且没有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多