查找文件,将其转换并存储在同一子目录中

时间:2015-02-02 09:48:49

标签: linux bash sox

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

找到音频文件
find -type f -name '*.au'

但我不知道如何将该列表传递给sox。该列表也在开头附加了子目录名。如何删除它?

2 个答案:

答案 0 :(得分:1)

不是专家;拿一小撮盐:

使用awk将find的输出转换为sox命令。然后将这些命令作为字符串传递给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,你可以使用这样的东西而不是找到:

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

答案 1 :(得分:0)

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

  1. 我得到了目录中所有文件的列表"流派"使用查找并将其存储在文件中。

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

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

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

    a = 0 #Integer。 读线;做sox" $ line" " $一个"的.wav;让" a + = 1&#34 ;;完成< names.txt