Подтвердить что ты не робот

Имя файла без расширения в bash для цикла

В цикле for, подобном этому:

for f in `ls *.avi`; do echo $f; ffmpeg -i $f $f.mp3; done

$f будет полным именем файла, включая расширение. Например, для song1.avi вывод команды будет song1.avi.mp3. Есть ли способ получить только song1, без .avi из цикла for?

Я предполагаю, что есть способы сделать это с помощью awk или других подобных инструментов, но я надеюсь на что-то более прямое.

Спасибо

4b9b3361

Ответ 1

Использовать расширение bash

${f%%.*}

Обратите внимание, что вам нужна жадная версия, потому что в имени файла есть несколько точек.

Из руководства bash:

${параметр% слово}

${параметр %% слово}

Слово расширяется для создания шаблона так же, как при расширении имени файла. Если шаблон совпадает с завершающей частью расширенного значения параметра, то результатом расширения является значение параметра с кратким шаблоном соответствия ( "% case" ) или длинным совпадающим шаблоном (случай "%%" ). Если параметр равен "@или", операция удаления шаблона применяется поочередно к каждому позиционному параметру, и расширение является результирующим списком. Если параметр является переменной массива, подстроенной с помощью "@или", операция удаления шаблона применяется поочередно к каждому члену массива, а расширение - это результирующий список.

Ответ 2

Это должно сделать это:

for i in *.m4a; do
  ffmpeg -i $i ${i%%.*}.mp3
done