Search
Write a publication
Pull to refresh

Сложный 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


Очень прошу помощи в правке кода, желательно с комментариями! Заранее благодарен.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.