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

Find a file, convert and store it in the same sub-directory

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

find -type f -name '*.au'

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

有问题的文件夹是从数据集 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";完成 < names.txt

不是专家;加少许盐服用:

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

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

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

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

但我不确定如何使用 xargs,所以...如果您想使用它,您可能需要充实细节。

Also that list has the sub-directory name appended to it at the beginning. How do I remove that?

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

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