Пакетный процесс Sox в Debian

Я хочу пересэмплировать кучу wav-файлов, которые у меня есть в папке.

Мой сценарий таков:

for f in *.wav; do sox “$f” -r 48000 “${f%%%.wav}.wav”; done

Консоль выдает мне эту ошибку: «sox FAIL formats: не удается открыть входной файл «90.wav»: нет такого файла или каталога» и т. д. с 300 файлами, помещенными в эту папку.

Как я могу пакетно обрабатывать эти файлы? Почему это дает мне эту ошибку?

Большое спасибо!

Решение:

for i in *wav; do echo $i; sox $i -r 48000 ${i%%.wav}r.wav; done

person DaNoiseMan    schedule 03.12.2014    source источник
comment
Попробуйте это: for f in ./*.wav; ...   -  person jan    schedule 03.12.2014
comment
Кажется, что 1 % слишком много, но если вы напишите "${f%%.wav}.wav" или даже "${f%.wav}.wav", это станет бесполезным... Вы не можете перезаписать файл, пока вы его читаете!   -  person techno    schedule 03.12.2014
comment
Что за знаки тройного процента? Я видел один и два, но не три. Краткий эксперимент показывает, что третий используется буквально, на востоке в Баше.   -  person tripleee    schedule 03.12.2014
comment
@techno Да, это работает случайно, фактически получая 09.wav.wav в качестве выходного файла, потому что замена ничего не сделала.   -  person tripleee    schedule 03.12.2014


Ответы (1)


Резюме: это символы кавычек

Проблема с двойными кавычками:

for f in *.wav; do sox “$f” -r 48000 “${f%%%.wav}.wav”; done

Двойные кавычки выше нестандартны. Чтобы они правильно обрабатывались оболочкой, необходимо использовать стандартный символ кавычек ASCII:

for f in ./*.wav; do sox "$f" -r 48000 "${f%%%.wav}.wav"; done

Кроме того, обратите внимание, что ${f%%%.wav} удаляет любые вхождения %.wav из конца имени входного файла. ${f%%%.wav}.wav добавляет один .wav обратно в конец после удаления всех суффиксов %.wav. Вы, вероятно, хотите что-то еще здесь.

Проверка

Используя неверные символы кавычек, согласно вопросу, обратите внимание на сообщение об ошибке:

$ for f in *.wav; do sox “$f” -r 48000 “${f%%%.wav}.wav”; done
sox FAIL formats: can't open input file `“90.wav”': No such file or directory

Обратите внимание, что имя файла в сообщении об ошибке отображается с двумя наборами кавычек вокруг имени файла. Это то, что вы видели в соответствии с сообщением об ошибке в вопросе. Внешние одинарные кавычки предоставляются sox. Внутренние двойные кавычки — это забавные символы кавычек, представленные в командной строке. Поскольку это нестандартные символы, оболочка оставила их на месте и передала команде sox.

Хотя файл 90.wav существует, файла с именем “90.wav” не существует. Отсюда и ошибка.

Вывод

Придерживайтесь стандартных символов ASCII для команд оболочки.

Эта проблема может легко возникнуть, если команды оболочки набираются с помощью модного текстового редактора, который заменяет типографски красивые, но нестандартные символы. Как указывает Tripleee, это также может произойти при копировании и вставке с веб-сайтов с неподходящим типографским стилем.

person John1024    schedule 03.12.2014
comment
... или копирование/вставка из блога, который глупо применяет типографский стиль к коду. - person tripleee; 03.12.2014
comment
@tripleee Отличная мысль: я только что добавил это в ответ. - person John1024; 03.12.2014
comment
У меня был скрипт, который отлично работал у меня с ImageMagick, а не с веб-сайта. У меня был сценарий на моем Диске в текстовом файле. Спасибо за ваш ответ, Джон. - person DaNoiseMan; 03.12.2014
comment
@DaNoiseMan Вы пробовали еще раз с простыми двойными кавычками ASCII? Если вы это сделали, но это не сработало, какое сообщение об ошибке вы получили? - person John1024; 03.12.2014
comment
Это сработало: for i in *wav; эхо $i; sox $i -r 48000 ${i%%.wav}r.wav; сделано Еще раз спасибо, Джон! - person DaNoiseMan; 03.12.2014