Резюме: это символы кавычек
Проблема с двойными кавычками:
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
%
слишком много, но если вы напишите"${f%%.wav}.wav"
или даже"${f%.wav}.wav"
, это станет бесполезным... Вы не можете перезаписать файл, пока вы его читаете! - person techno   schedule 03.12.201409.wav.wav
в качестве выходного файла, потому что замена ничего не сделала. - person tripleee   schedule 03.12.2014