2016-04-17 3 views
0

Я пытаюсь получить базовое имя (без расширения файла), чтобы я мог быстро обрабатывать каталог аудиофайлов (.flac -> .m4a) и создавать правильные имена файлов.ZSH: получить basename for for loop

Так это работает:

for i in *.flac;do ffmpeg -i $i -c:a libfdk_aac -vbr 3 $i.m4a; done 

Но это оставляет меня с файлом, как так: audiofile.flac.m4a

Что я хотел бы сделать, это просто захватить «аудиофайл» часть имени файла, так что это работает:

for i in *.flac;do ffmpeg -i $i.flac -c:a libfdk_aac -vbr 3 $i.m4a; done 

Но я не понимаю, модификаторы (по-видимому «: т»? модификатор может получить мне результаты) или как определить переменные на для loop (для каждого файла). Кроме того, я вижу, что есть много примеров того, как это сделать с BASH, но я ищу что-то, что работает с zsh.

Любые идеи?

Спасибо!

ответ

1

В zsh вы можете использовать Modifiers from History Expansion с Parameter Expansions. Каждый модификатор предшествует двоеточие: ${name:modifier}. The г modifier removes the extension, i.e. everything from - including - the last .` до конца имени файла:

for i in *.flac; do 
    ffmpeg -i $i -c:a libfdk_aac -vbr 3 ${i:r}.m4a 
done 

Примечание: модификатор r будет удалить любое расширение, а не только «.flac».

Более портативный (читай: должен работать в любой POSIX-совместимой оболочки), а также конкретное решение будет использовать параметр разложения${name%pattern}, который будет удалить наименьшее строку, соответствующую pattern от конца стоимости name. Если pattern не соответствует концу значения name, значение будет возвращено без изменений:

for i in *.flac; do 
    ffmpeg -i $i -c:a libfdk_aac -vbr 3 ${i%.flac}.m4a 
done 

Это удалит только «.flac» специально с конца имен файлов.