Удалить ведущий "./" в пакетном скрипте

for f in ./*.mp3; do sox "$f" "${f%%.mp3}processed.mp3" silence 1 0.02 1% -1 0.02 1%; done

Это скрипт, который я использую для обработки аудио файлов. Проблема в том, что он продолжает работать в цикле, также обрабатывая новые аудиофайлы. Я хотел бы исправить это, поместив вывод в подпапку, поэтому я попробовал это:

for f in ./*.mp3; do sox "$f" "/subfolder${f%%.mp3}processed.mp3" silence 1 0.02 1% -1 0.02 1%; done

Это вывод:

/subfolder./01processed.mp3

Это дает мне ошибку с Sox, мне нужно удалить./ перед выводом имени файла, как я могу это сделать? Вот что я хотел бы получить:

/subfolder/01processed.mp3

2 ответа

Решение
for f in *.mp3; do sox "$f" "/subfolder/${f%%.mp3}processed.mp3" silence 1 0.02 1% -1 0.02 1%; done
for f in ./*.mp3; do
    out=${f#./}
    out=${out%%.mp3}processed.mp3
    sox "$f" "/subfolder/$out" silence 1 0.02 1% -1 0.02 1%
done

Вы можете лишить обоих ведущих ./ и тянущийся mp3, но расширения параметров должны выполняться по одному (они не могут быть вложенными). Вы могли раздеть только ведущих . и держать / когда вы строите выходной путь, но яснее его убрать и явно вернуть обратно. (/subfolder$out не дает понять, что файл помещается в папку с именем subfolderвместо создания файла / папки с именем subfolder$out.)

Между прочим, for f in ./*.mp3 это самая правильная версия, так как она будет работать с файлами, которые начинаются с -; иначе, sox может принять имя входного файла за опцию.

Другие вопросы по тегам