Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > *NIX системы: Общие вопросы > код работал при наличии пробелов в именах файлов


Автор: arcsupport 15.12.2011, 09:21
Как сделать, что приведенный ниже код корректно работал при наличии пробелов в именах файлов:
Код

for i in "$(ls *.mp4)"; do ffmpeg -i "$i" "$i.avi"; done


Добавлено через 2 минуты и 25 секунд
Я так понимаю, надо как-то заставить ls экранировать пробелы.

Автор: newbee 15.12.2011, 09:49
Тут проблема не в ls, а в том, что for считает пробел разделителем. Сделай так:

Код
find . -name "*\.mp4" | while read i; do ffmpeg -i "$i" "$(echo $i | sed -e 's/\.mp4$/\.avi/')"; done

Автор: arcsupport 15.12.2011, 10:40
Делал подобное вчера ночью. Обрабатывался только первый файл. И всё.

Автор: newbee 15.12.2011, 10:47
Что-то "подобное" ты делал неправильно.

Добавлено через 3 минуты и 57 секунд
Отредактировала предыдущий комментарий, кавычки забыла поставить.

Автор: arcsupport 15.12.2011, 11:36
Спасибо. А не могли бы объяснить, что еще за возможность с заданием переменной
Код

IFS=$'\n'

Автор: newbee 15.12.2011, 12:09
Переменная IFS задает разделитель (или набор разделителей - я не помню) для for. Но он мне издавна не нравился, поэтому я про него сразу и не вспомнила. Тебе еще можно сделать так:

Код

IFS=$(echo -e "\n")
for i in "$(ls)"; do ... ; done

Автор: arcsupport 15.12.2011, 15:10
Вот этот код с помощью ffmpeg все равно обработает только первый файл:
Код
#!/bin/sh
rm *.avi
ls *.mp4 | sort | while read i; do mv "$i" "$(echo "$i" | sed -e 's/\ /\./g')"; done
find . -name "*\.mp4" | sort | while read i; do ffmpeg -i $i $(echo "$i" | sed -e 's/\.mp4/\.avi/'); true; done
exit 0

Автор: newbee 16.12.2011, 09:42
Хм, полчаса проковырялась. ffmpeg похоже переводит терминал в интерактивный режим и из-за этого шелл "забывает" о цикле... Наверое есть более правильное объяснение этому явлению, и, надеюсь, его здесь приведут, но решение я таки придумала smile

Код

... do; echo -n | ffmpeg ... ; done

Автор: arcsupport 16.12.2011, 10:30
Спасибо Вам большое, newbee. Если не секрет, объясните ход Ваших мыслей.

Автор: newbee 16.12.2011, 10:41
Пожалуйста.

Ход мыслей такой... Во время выполнения кодирования ffmpeg написал что-то вроде "нажми на q, чтобы выйти". Я ничего не трогала, но после обработки первого файла все закончилось. Вообще программа может проверить, запускается она прямо из шелла или нет (например, если она в цепочке конвеера) - и так я пришла к мысли выключить ее интерактивность, запихав в безобдный конвеер smile

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

Автор: bilbobagginz 16.12.2011, 13:24
если есть пробелы, то find должен знать + xargs тоже.
Код

find . -iname "*.bla" -print0 | xargs --no-run-if-empty -0 ffmpeg -flags

Автор: arcsupport 16.12.2011, 20:50
bilbobagginz, очень Вас прошу, приведите работающий пример для случая команды:
Код
find . -name "*\.mp4" | sort | while read i; do ffmpeg -i $i $(echo "$i" | sed -e 's/\.mp4/\.avi/'); true; done

Автор: bilbobagginz 17.12.2011, 22:45
arcsupport, уж больно замутился с переименовкой.
файнд находит. харгс запускает команды. у вас конвеер совсем по-другому построен.
не рабочий пример:
Код

find . -iname "*.mp4" -print0 | xargs -0 -i ffmpeg -i '{}' '{}'.avi

не рабочий, т.к. потом надо будет делать цикл переименовки.



Автор: arcsupport 19.12.2011, 09:10
Буду на некоторое время считать это вопрос решенным.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)