Использование имен файлов с пробелами и gawk

У меня есть список файлов, которые я хотел бы обработать с помощью gawk. Вот моя команда:

ls -1 *.wma | gawk '{printf("ffmpeg -i %s track4-%s.mp3\n",$0, $1);}'

Но поскольку исходные имена файлов содержат пробелы, я получаю такие команды, как

ffmpeg -i 02 Track 2.wma track4-02.mp3

которые не работают, так как пробелы не экранированы. Любые идеи, как сделать это правильно?

Ожидаемый результат должен быть

ffmpeg -i 02\ Track\ 2.wma track4-02.mp3

person Alex    schedule 14.08.2013    source источник
comment
возможно, вы ищете: linux.die.net/man/1/xargs   -  person technosaurus    schedule 15.08.2013


Ответы (2)


Это бесполезное и ошибочное использование ls, попробуйте вместо этого использовать glob :

for file in *.wma; do
    mp3=$(sed -r 's@([0-9]+)\s+Track\s+[0-9]+\.wma@track4-\1.mp3@' <<< "$file")
    ffmpeg -i "$file" "$mp3"
done

ls — это инструмент для интерактивного просмотра информации о файле. Его вывод отформатирован для людей и вызовет ошибки в сценариях. Вместо этого используйте globs или find. Поймите, почему: http://mywiki.wooledge.org/ParsingLs

person Gilles Quenot    schedule 14.08.2013
comment
Но я не просто хочу заменить wma на mp3. Смотрите обновленный вопрос. Извините за неточность. - person Alex; 15.08.2013
comment
это, к сожалению, не работает. Я получаю такие команды, как ffmpeg -i 01 Track 1.wma. - person Alex; 15.08.2013
comment
Нет, ffmpeg выдает результат Unable to find a suitable output format for ''. - person Alex; 15.08.2013
comment
Работает ли простая тестовая команда без пробелов? Проверь это. Опять же, это работает для меня (archlinux и ffmpeg 2.0) - person Gilles Quenot; 15.08.2013

Поскольку мне кажется, что нет простого способа избавиться от пробелов в именах файлов, чтобы сделать такое, казалось бы, простое преобразование имен файлов, я придумал трехстрочное решение, которое работает для меня в python:

import glob
for filename in glob.glob("*.wma"):
    print "ffmpeg -i {0} track4-{1}.mp3".format(filename.replace(' ','\ '),filename[:2])

Мне потребовалось 2 минуты, чтобы сделать это на питоне. Bash не подходит для этой простой задачи.

person Alex    schedule 14.08.2013