Конкатенация файлов в подпапках с помощью sox - PullRequest
1 голос
/ 15 апреля 2020

У меня есть папка с подпапками, содержащими файлы WAV, которые мне нужно объединить, в результате чего на каждую папку приходится 1 файл WAV.

В каждой отдельной папке я могу использовать sox для выполнения: sox *.wav combined.wav, но у меня есть 1000 папок.

Как мне:

a) написать команду (используя Ma c терминал) объединить все файлы в подпапках для каждой подпапки? б) убедитесь, что полученный файл имеет подходящее имя, например, имя подпапки?

Я попытался привести пример структуры моего файла ниже:

например,

Аудио файлы

170

170_a.wav

170_b.wav

170_ c .wav

170_d. wav

171

171_a.wav

171_b.wav

171_ c .wav

171_d.wav

et c.

И я хотел бы закончить 170_combined.wav и 171_combined.wav et c.

1 Ответ

0 голосов
/ 15 апреля 2020

Вы можете попробовать использовать find

find . -type d -exec bash -O nullglob -c 'cd "$0" && files=(*.wav) && ((${#files[@]})) && echo sox "${files[@]}" "${0##*/}_combined.wav"' {} \;
  • Это ничего не изменит, кроме вывода результата на stdout.

  • Удалите echo, если вы считаете, что вывод в порядке, так что он на самом деле преобразует файлы.

Краткое объяснение.

  • -type d означает, что find будет искать только каталог.

  • -exec используется, поэтому мы можем вызывать / вызывать оболочку для выполнения задач оболочки.

  • bash -O nullglob На всякий случай, если нет файлов, глобус *.wav не будет расширяться. (файлы не будут добавлены в array files)

  • -c Выполнить команды оболочки

  • cd "$0" && go внутри каждого каталога && выполнить следующую команду, если команда до ее выполнения.

  • files=(*.wav) && Создать массив из *.wav файлов

  • ((${#files[@]})) Если массив не пустой (есть файлы *.wav)

  • sox "${files[@]}" "${0##*/}_combined.wav Запуск sox для всех файлов *.wav, "${0##*/} удаляет имя файла из пути.

...