Приветствую Вас, уважаемые хабровчане.
Передо мной встала тривиальная задача: создать очень сложный bash скрипт. С Линуксом общаюсь я недавно, а с программированием вообще не знаком :-/
Введение:
Работаю в микрофинансовой организации помощником программиста, мне дали такое задание, которое я, видимо, не осилю в одиночку. И, да, чтобы не было вопросов, — программист мне не поможет с Башем ничем, он специализируется по Лазарусу.
Исходные данные:
Итак, есть сеть точек по выдаче займов, на каждой точке установлено видео наблюдение. Видео пишется через программку iSpy отрывками по датчику движения, и отрывки кидаются в папку. Фрагменты записываются в формате mp4 с разрешением 320*240, кодек H.264 / AVC, частота 7 fps, скорость потока 94 kbps, и пока без звука. Нужно автоматически, ежедневно в каждой папке переконвертировать фрагменты в avi, склеить фрагменты в один файл и запихнуть его в архив. Ну и, конечно же, очистить папку от фрагментов.
Пути и папки:
smb://video-server/lv2/iSpy/video — так путь вижу я
Z:/ispy/video/ — так видит путь машина win7


Краткая логика скрипта:
Вот, собственно, чего я сам намудрил: (не пинайте сильно)
Вспомогательный скрипт mkdir.sh который делает основную работу по конвертированию и склейке:
Очень прошу помощи в правке кода, желательно с комментариями! Заранее благодарен.
Передо мной встала тривиальная задача: создать очень сложный bash скрипт. С Линуксом общаюсь я недавно, а с программированием вообще не знаком :-/
Введение:
Работаю в микрофинансовой организации помощником программиста, мне дали такое задание, которое я, видимо, не осилю в одиночку. И, да, чтобы не было вопросов, — программист мне не поможет с Башем ничем, он специализируется по Лазарусу.
Исходные данные:
- машина win 7, с установленным ПО iSpy
- более десятка веб-камер (количество будет увеличиваться)
- машина Ubuntu 12.04 (с которой собственно я и работаю)
Итак, есть сеть точек по выдаче займов, на каждой точке установлено видео наблюдение. Видео пишется через программку iSpy отрывками по датчику движения, и отрывки кидаются в папку. Фрагменты записываются в формате mp4 с разрешением 320*240, кодек H.264 / AVC, частота 7 fps, скорость потока 94 kbps, и пока без звука. Нужно автоматически, ежедневно в каждой папке переконвертировать фрагменты в avi, склеить фрагменты в один файл и запихнуть его в архив. Ну и, конечно же, очистить папку от фрагментов.
Пути и папки:
smb://video-server/lv2/iSpy/video — так путь вижу я
Z:/ispy/video/ — так видит путь машина win7


Краткая логика скрипта:
- Создать построчный список путей папок с точками и записать в лог
- Автоматом создать переменные и присвоить им значения путей этих папок (из лога). Завернуть в массив
- Выполнить цикл конвертирования и склейки фрагментов для каждого элемента массива
Вот, собственно, чего я сам намудрил: (не пинайте сильно)
#!/bin/bash path=$(dirname smb://video-server/lv2/iSpy/video) arhiv=$(dirname $path/Архив ) log=log.txt #объявление переменных cd $path #смена каталога N=0 #объявление переменной равной номеру первой строки из лога ls -d */ -l | grep -v Архив | awk '{print $9,$10,$11,$12,$13}' > $path/$log #вывести список папок даже с пробелами (до 5 пробелов в имени), сохранить список в лог cols=`cat $path/$log | wc -l | echo` #присвоение переменной $cols значение числа строк лога tochka=() #создаём пустой массив until [ "$N" -eq "$cols" ] #открываем условный цикл, с уловием, пока переменная $N не станет равна числу строк в логе $cols do tochka=( ${tochka[$N]} ) #добавить новый элемент в массив ${tochka[$N]}=(cat $path/$log | sed -n "$N"p | экранировать_пробелы_в_путях_папок_пайпом ) #присвоить элементу массива $tochka[$N] значение строчки $N из лога for tochka in ${tochka[$N]} do ./home/simon/mkdir.sh #запустить для элемента цикл перекодирования и склейки через отдельный скрипт let $N+=1 #присвоить переменной $N значение равное "Число предыдущей строки + 1" done done #выполнение цикла для всех элементов массива rm $path/$log #удаляем лог exit 0
Вспомогательный скрипт mkdir.sh который делает основную работу по конвертированию и склейке:
cd $path+${tochka[$N]} #Смена каталога if ! [ -d $path/${tochka[$N]}Converted ]; then -- else mkdir $path/${tochka[$N]}Converted fi #Создаём папку Converted если её нет if ! [ -d $arhiv+${tochka[$N]} ]; then -- else mkdir $arhiv+${tochka[$N]} fi #Создаём папку $arhiv${tochka[$N]} если её нет for invideo in `find -name '*.mp4'`; do ffmpeg -i $invideo -deinterlace -target pal-dvd Converted/${invideo%%.mp4}.avi; done; #Конвертируем все mp4 фрагменты в avi через ffmpeg в папку 'Converted' (Поправить кодирование, чтобы занимало меньше места) mencoder -ovc copy -oac copy -o Converted/$(date +%d-%m-%Y)-"${tochka["$N"]}".avi Converted/*.avi #Склеиваем avi фрагменты в файл папки 'Converted' mv $path/${tochka[$N]}Converted/*.avi $arhiv/${tochka[$N]} #Перемещаем в архив склееный, сконвертированный файл rm $path/${tochka[$N]}*.mp4 #Чистим папку 'to4ka1' от фрагментов mp4 rm $path/${tochka[$N]}Converted/*.avi #Чистим папку 'Converted' от фрагментов avi
Очень прошу помощи в правке кода, желательно с комментариями! Заранее благодарен.