【问题标题】:Find a file, convert and store it in the same sub-directory查找文件,转换并存储在同一子目录中
【发布时间】:2015-02-02 09:48:48
【问题描述】:

我想将 .au 音频数据集转换为 .wav。它以流派的方式存储在文件夹中(流派 -> 摇滚、爵士、金属等)。我可以使用命令找到音频文件 -

find -type f -name '*.au'

但我不知道如何将该列表传递给 sox。此外,该列表的开头还附加了子目录名称。如何删除它?

【问题讨论】:

  • 用管道传送到xargs 怎么样?阅读xargs 的手册页。如果您仍有疑问,请询问。一个例子:检查某个目录下的message.txt文件和cat它使用它像:find .cache/bower/ -name "message.txt" | xargs cat
  • 从该列表中获取单个条目不是问题,尽管我感谢您提供这个漂亮的命令。我做了一系列例程,我现在将其作为答案发布。如果你有捷径,我会很高兴看到的。

标签: linux bash sox


【解决方案1】:

不是专家;加少许盐:

使用 awk 将find 的输出转换为sox 命令。然后将这些命令作为字符串传递给 bash,bash 会解释它们(就像你给了它们一个脚本一样):

find -type f -name '*.au' | awk '{printf "sox [your format options] %s %s\n",$0,$0".wav" }' | bash

我认为,一个更优雅且可能更好的解决方案是使用 xargs 将 awk 的输出转换为 sox 的参数;类似:

find -type f -name '*.au' | awk '{printf "[your format options] %s %s\n",$0,$0".wav" }' | xargs sox

但我不确定如何使用 xargs,所以……如果你想使用它,你可能必须充实细节。

此外,该列表的开头还附加了子目录名称。如何删除它?

为什么要删除它?您需要它来引用目录中的文件。 Aynway,你可以用这样的东西代替 find:

ls Files/relationship/ | grep '\.old'

【讨论】:

  • 谢谢,看起来很整洁。我删除目录名的意思是,对于读取为“./metal/metal.00099.au”的文件名,我希望它在“metal”文件夹中保存为“metal.00099.wav”,而不是在根文件夹中有“./metal/metal.00099.au.wav”。在我认为的同样方面,你的不足。 :)
  • 我认为这不会发生......但我不会赌我的头。它应该将./metal/metal.00099.au.wa 解释为metal.00099.aw.wav ./metal。顺便说一句,您也可以使用 basenamesubstr 删除扩展名 .au,我的 AWK 只做了最低限度的操作。
  • 对不起,你是对的。它保存在正确的子目录中。
【解决方案2】:

有问题的文件夹是从数据集genres.tar.gz 中提取的,可以从这里获得-http://opihi.cs.uvic.ca/sound/genres.tar.gz

  1. 我使用 find 获得了目录“genres”中所有文件的列表并将其存储在一个文件中。

    find -type f -name '*.au' > names.txt

  2. 此列表未排序,因此我在 python 中打开它,读取每一行,将其附加到列表中,对其进行排序,然后将该列表保存在此文件中。

  3. 使用此循环,将每个文件转换为 .wav,虽然我无法恢复文件名,所以使用变量重命名它们。

    a=0 #整数。 而读线;做 sox "$line" "$a".wav;让 "a+=1";完成

【讨论】:

  • 我不喜欢这种方法,因为这只是一个 hack。如果有人能想出更好的东西 - 1. 保留文件名(扩展名除外) 2. 能够将转换后的文件保存在与其来源相同的子目录中。那会很有帮助。
猜你喜欢
  • 2017-04-24
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
相关资源
最近更新 更多