Как стать автором
Обновить

Сложный Bash-скрипт

Приветствую Вас, уважаемые хабровчане.

Передо мной встала тривиальная задача: создать очень сложный 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

image
image

Краткая логика скрипта:
  1. Создать построчный список путей папок с точками и записать в лог
  2. Автоматом создать переменные и присвоить им значения путей этих папок (из лога). Завернуть в массив
  3. Выполнить цикл конвертирования и склейки фрагментов для каждого элемента массива


Вот, собственно, чего я сам намудрил: (не пинайте сильно)
#!/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


Очень прошу помощи в правке кода, желательно с комментариями! Заранее благодарен.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.