Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Пакетная обработка с bash?  (Прочитано 4281 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Zhook

  • Автор темы
  • Участник
  • *
  • Сообщений: 182
  • Super Zhook. Xubuntu 12.04; GIMP 2.8; Pentium 4; Geforce 6600.
    • Просмотр профиля
Re: Пакетная обработка с bash?
« Ответ #15 : 24 Июня 2012, 13:00:10 »
 :2funny:Разобрался с длинными именами ;D, правда пока не внедрял в сам конвертер :).
Вот скрипт. Обратите внимание на эхо красного цвета(входные и выходные файлы(потом просто вывести на explay n  ;))):
#!/bin/bash
filename="0"
do="0"
BLUE="$(echo -e '\033[1;34m')"
CYAN="$(echo -e '\033[1;36m')"
GREEN="$(echo -e '\033[1;32m')"
MAGENTA="$(echo -e '\033[1;35m')"
RED="$(echo -e '\033[1;31m')"
YELLOW="$(echo -e '\033[1;33m')"
NORMAL="$(echo -e '\033[0;39m')"
 COUNT="0001"
numberline="1"
function outfilename ()
{
echo $COUNT;COUNT=`echo $COUNT"+1" | bc -l`; echo $COUNT
}
function outnum ()
{
echo $numberline;COUNT=`echo $numberline"+1" | bc -l`; echo $numberline
}
> $1/z.txt
#echo "#!/bin/bash" >> $1/z
mkdir /tmp/avis

AVIS=$(ls $1 | grep -i ".avi")
FLVS=$(ls $1 | grep -i ".flv")
MOVS=$(ls $1 | grep -i ".mov")
for line in $AVIS ;
do

if [ -z $( echo $line | grep -i ".avi" ) ]
then
if [ $do -ne "0" ]
then
filename=`echo $filename $line`
echo $line
fi
if [ $do -eq "0" ]
then
filename=$line
do="1"
echo $line
fi

else
echo $line
line1=`echo $filename`
#line1=$(cat ./z.txt | awk NR==$numberline )
if [ $do -eq "0" ]
then
echo "$RED" $line "$NORMAL"
else
####А вот дальше надо думать########
line2=`echo $line1 $line`
echo "$RED" "$1/$line2" "$NORMAL"
cp "$1/$line2" /tmp/avis/$COUNT.avi
echo "$RED" /tmp/avis/$COUNT.avi "$NORMAL"
outfilename
filename="0"
do="0"
#cp "$1/$line1 $line2" /tmp/avis/$COUNT.avi

#outfilename
#> ./z.txt
fi
fi

done ;
echo "$RED" "BWA-HA-HA-HA-HA!!!!!" "$NORMAL"
exit 0
Эх!Думаете шесть маленьких лапок на одну большую клавиатуру - это удобно??!

Оффлайн Дмитрий Бо

  • Погонщик серверов
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 3549
  • Я не техподдержка, я за порядком слежу
    • Просмотр профиля
Re: Пакетная обработка с bash?
« Ответ #16 : 24 Июня 2012, 15:23:13 »
Зачем ему инсталлятор? Он не может работать без установки?

Зачем одним скриптом генерить другой? Почему нельзя всё сделать в одном?

Оффлайн Zhook

  • Автор темы
  • Участник
  • *
  • Сообщений: 182
  • Super Zhook. Xubuntu 12.04; GIMP 2.8; Pentium 4; Geforce 6600.
    • Просмотр профиля
Re: Пакетная обработка с bash?
« Ответ #17 : 25 Июня 2012, 08:20:57 »
Цитировать
Зачем ему инсталлятор?Почему нельзя всё сделать в одном?
На настоящий момент я понял, как собрать всё в один скрипт(без z и инстайлера), но не знаю, будет ли это удобно.

Цитировать
Он не может работать без установки?
Без установки скрипт работать может, но не удобно же каждый раз вводить ~/Desktop/explay.
А так просто открывается папка в терминале
 explay filename n
и готово.

Цитировать
Зачем одним скриптом генерить другой?
Скрипта z не будет. Всё введу в основной скрипт. А инстайлер не генерит, а только копирует в нужное место(для удобства).

Разобрался как добавить поддержку имён файлов из нескольких слов непосредственно в скрипт:
mencoder "$file" -o "$output" -ofps 15 -vf-add scale=160:90  -vf-add expand=160:128:-1:-1:1 -srate 44100 -ovc xvid -stereo 0 -xvidencopts bitrate=300:max_bframes=0:quant_type=h263:me_quality=0 -oac lavc -lavcopts acodec=mp2:abitrate=128
exit 0
(просто указать переменную в кавычках, правда при запуске имя файла тоже надо вводить в кавычках(чтобы читалось как одно слово, а не как список аргументов)).

Сегодня думаю объединить скрипты в один(инстайлер будет в составе главного(explay install)).
Финальный вариант выложу, как только сделаю. Просмотрите пожалуйста на наличие возможных ошибок, неоптимальных решений.

Остался лишь один глупый вопрос(последний(ответьте, пожалуйста)): как удалить все символы / из фразы?
Пример /user/asd надо чтобы отображалось как userasd.
Я знаю, что их как-то можно экранировать. Но как?

Если знаете, как оптимизировать это в рамках Bash(других рабочих языков просто не знаю), - объясните, пожалуйста, - постараюсь сделать.

В любом случае, огромное спасибо за помощь!
Эх!Думаете шесть маленьких лапок на одну большую клавиатуру - это удобно??!

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Пакетная обработка с bash?
« Ответ #18 : 25 Июня 2012, 08:26:27 »
al@al-desktop:~$ echo "/user/asd" | sed 's/\///g'
userasd

Оффлайн Zhook

  • Автор темы
  • Участник
  • *
  • Сообщений: 182
  • Super Zhook. Xubuntu 12.04; GIMP 2.8; Pentium 4; Geforce 6600.
    • Просмотр профиля
Re: Пакетная обработка с bash?
« Ответ #19 : 25 Июня 2012, 12:52:13 »
al@al-desktop:~$ echo "/user/asd" | sed 's/\///g'
userasd

Спасибо!

А вот новая версия скрипта explay:
#!/bin/bash
#explay
troubles=`echo $GREEN "OK" $NORMAL`
troublered=`echo $RED "Найдены проблемы:" $NORMAL`
function checkexit ()
{
troublecrash=$?
if [ $troublecrash -ne 0 ]
then
echo $RED "Команда вернула код завершения:" $troublecrash $NORMAL
troubles=`echo $RED $troublered $troublecrash $NORMAL`
else
echo $GREEN "OK" $NORMAL
fi
}
###################Переменные#######################
case "$1" in
"install" )
echo "install"
installexplay
exit 0
;;
*)
file=$1
;;
esac
filename="0"
do="0"
COUNT="0001"
numberline="1"
file2=`echo "$file" | sed 's/\///g'`
ofold=$(head ~/.explay-c40_converter/expconfig)

if [ -z "$3" ]
 then output=$ofold/$file2.avi
else output=$3
fi
echo $output
##############Цветовые схемы################
NORMAL="$(echo -e '\033[0;39m')"
BLUE="$(echo -e '\033[1;34m')"
CYAN="$(echo -e '\033[1;36m')"
GREEN="$(echo -e '\033[1;32m')"
MAGENTA="$(echo -e '\033[1;35m')"
RED="$(echo -e '\033[1;31m')"
YELLOW="$(echo -e '\033[1;33m')"
##############################

##############Функции видео##################
function normal ()
{
    mencoder "$file" -o "$output" -ofps 15 -vf-add scale=160:90  -vf-add expand=160:128:-1:-1:1 -srate 44100 -ovc xvid -stereo 0 -xvidencopts bitrate=300:max_bframes=0:quant_type=h263:me_quality=0 -oac lavc -lavcopts acodec=mp2:abitrate=128
checkexit
}

function high ()
{
    mencoder "$file" -o "$output" -ofps 15 -vf-add scale=160:120 -vf-add expand=160:128:-1:-1:1 -srate 44100 -ovc xvid -stereo 0 -xvidencopts bitrate=400:max_bframes=0:quant_type=h263:me_quality=0 -oac lavc -lavcopts acodec=mp2:abitrate=128 ;
checkexit
}

##############Функции настройка##################

function installexplay ()
{
#setup
echo $BLUE "Explay C40 Video Converter Setup" $NORMAL
INSTDIR=`dirname "$0"`
ROOT_UID=0
if [ "$UID" -ne "$ROOT_UID" ]
then
  echo $RED "Для установки требуются права root. Поэтому может потребоваться пароль." $NORMAL
fi
sudo cp $INSTDIR/explay /usr/bin/explay
checkexit
sudo mkdir ~/.explay-c40_converter
sudo chmod 777  ~/.explay-c40_converter
checkexit
sudo chmod 775 /usr/bin/explay
checkexit
sudo chmod +x /usr/bin/explay
checkexit
exit 0
}

function config ()
{
echo $BLUE "                ""НАСТРОЙКА""                 " $NORMAL
echo "Подсоедините устройство и укажите путь к нему"
echo "или укажите конечную папку не на устройстве(по умолчанию /tmp)."
echo ""
echo $RED "Если в указанном пути используются имена, содержащие два или более слов,"
echo "используйте обратный слеш(\) перед пробелами."
echo  "Путь к домашнему каталогу указывать как /home/имя_пользователя,"
echo "а не как ~/" $NORMAL
echo ""
echo "Конфигурация вступит в силу при следующем запуске конвертера"
echo "Ваш ответ:"
read path
case "$path" in
"" )
> ~/.explay-c40_converter/expconfig
echo "/tmp" >> ~/.explay-c40_converter/expconfig
echo $RED "Конечная папка: /tmp" $NORMAL
;;
* )
> ~/.explay-c40_converter/expconfig
echo $path >> ~/.explay-c40_converter/expconfig
checkexit
esac
exit 0
}
function input ()
{
echo echo $BLUE "                ""ПАКЕТНАЯ ОБРАБОТКА""                 " $NORMAL
echo "Укажите папку с видеофайлами."
echo ""
echo $RED "Будут замечены только файлы форматов avi, mov, flv и mp4."
echo "Если в указанном пути используются имена, содержащие два или более слов,"
echo "используйте обратный слеш(\) перед пробелами."
echo "Путь к домашнему каталогу указывать как /home/имя_пользователя,"
echo "а не как ~/" $NORMAL
echo ""
echo "Ваш ответ:"
read path
case "$path" in
"" )
echo $RED "Вы не указали путь!!!" $NORMAL
echo "Укажите папку с видеофайлами."
read path
;;
* )
packcoder $path
checkexit
esac
exit 0
}

function inform ()
{

echo $BLUE "Конвертер для проигрывателя Explay C40" $NORMAL
echo "Кодеки:"
echo "Видео XVID 15fps 160x128"
echo "Аудио MP2"
echo "Конечная папка:"
cat ~/.explay-c40_converter/expconfig
echo "Использование для одиночных файлов: explay имя_видео параметр"
echo "[n] - нормальное качество(по умолчанию)"
echo "[h] - высокое качество"
echo "Например explay file.avi n"
echo "Использование в пакетном режиме: "
echo "explay"
echo "Выбрать p"
echo "Указать папку с видео"
echo "Указать качество"
echo ""
echo "                Установка            "
echo "Запустить explay с параметром install"
echo "explay install"
checkexit
}


##################################

############Функции проверки имени#############
function notzero ()
{
if [ $do -ne "0" ]
then
filename=`echo $filename $line`
echo $line
fi
}

function yeszero ()
{
if [ $do -eq "0" ]
then
filename=$line
do="1"
echo $line
fi
}

function finalpackout ()
{

echo $packdirname
echo $line
line1=`echo $filename`
if [ $do -eq "0" ]
then
echo "$GREEN" $line "$NORMAL"
else
line2=`echo $line1 $line`
echo "$RED" "$packdirname/$line2" "$NORMAL"
cp "$packdirname/$line2" /tmp/avis/$COUNT.avi
echo "$GREEN" /tmp/avis/$COUNT.avi "$NORMAL"
file=/tmp/avis/$COUNT.avi
file2=`echo "$line2" | sed 's/\///g'`
output=$ofold/"$file2.avi"
case "$qual" in
"N" | "n")
echo "normal"
normal
;;
"H" | "h")
echo "high"
high
;;
*)
echo "Использовать настройки по-умолчанию?[y/n]"
read problem
case "$problem" in
"Y" | "y") normal
echo "Нормальный"
;;

*) exit 0
;;
esac
esac

fi
}

##############Генерация имён################
function outfilename ()
{
echo $COUNT;COUNT=`echo $COUNT"+1" | bc -l`; echo $COUNT
}

#############################################

####################Quality Metrics##########################
function qualitymetr ()
{
echo "В каком качестве конвертировать?"
echo ""
echo "[n] - нормальное качество(по умолчанию)"
echo "[h] - высокое качество"
read qual

outfilename
filename="0"
do="0"



}
#########################################################


##############Пакетное кодирование#################
function packcoder ()
{
packdirname=$1
mkdir /tmp/avis
AVIS=$(ls $packdirname | grep -i ".avi")
FLVS=$(ls $packdirname | grep -i ".flv")
MOVS=$(ls $packdirname | grep -i ".mov")
MPS=$(ls $packdirname | grep -i ".mp4")
qualitymetr

for line in $AVIS ;
do

if [ -z $( echo $line | grep -i ".avi" ) ]
then
notzero
yeszero
else
finalpackout
fi

done ;

for line in $FLVS ;
do
if [ -z $( echo $line | grep -i ".flv" ) ]
then
notzero
yeszero
else
finalpackout
fi
done ;

for line in $MOVS ;
do
if [ -z $( echo $line | grep -i ".mov" ) ]
then
notzero
yeszero
else
finalpackout
fi
done ;

for line in $MPS ;
do
if [ -z $( echo $line | grep -i ".mp4" ) ]
then
notzero
yeszero
else
finalpackout
fi
done ;

checkexit
}

##################################################################

#################################################################


echo $BLUE "           ""Конвертер видео для Explay C40" "               " $NORMAL
if [ -z "$(cat ~/.explay-c40_converter/expconfig | awk NR==$numberline )" ]
 then echo "необходима настройка" ;
        config ;
fi

if [ -z "$2" ]
  then  echo "Укажите опции кодирования!"
        echo "[n] - нормальное качество(по умолчанию)"
        echo "[h] - высокое качество"
        echo "[c] - выбрать конечную папку"
        echo "[i] - инфо"
        echo "[p] - пакетная обработка"
        echo "[install] - установка"
        read param
        else param=$2 ;
fi

case "$param" in
"N" | "n")
echo "normal"
normal
;;
"H" | "h")
echo "high"
high
;;
"C" | "c")
echo "config"
clear
config
;;
"P" | "p")
echo "packed"
clear
input
;;
"I" | "i")
echo "info"
clear
inform
;;
"install" )
echo "install"
installexplay
exit 0
;;
*) echo "Использовать настройки по-умолчанию?[y/n]"
read problem
case "$problem" in
"Y" | "y") normal
echo "Нормальный"
;;

*) exit 0
;;
esac;
esac;
echo $troubles
exit 0
exit 0


Пользователь решил продолжить мысль 25 Июня 2012, 12:57:17:
Посмотрите, пожалуйста, на правильность, я, вроде, ошибок не нашёл.
« Последнее редактирование: 25 Июня 2012, 14:18:02 от Zhook »
Эх!Думаете шесть маленьких лапок на одну большую клавиатуру - это удобно??!

Оффлайн Vitsliputsli

  • Старожил
  • *
  • Сообщений: 1293
    • Просмотр профиля
Re: Пакетная обработка с bash?
« Ответ #20 : 25 Июня 2012, 14:04:27 »
Все не осилил, но вместо монструозной конструкции собирания длинных имен по кусочкам, можно попробовать:
ls | while read line; do echo $line; done

Оффлайн Zhook

  • Автор темы
  • Участник
  • *
  • Сообщений: 182
  • Super Zhook. Xubuntu 12.04; GIMP 2.8; Pentium 4; Geforce 6600.
    • Просмотр профиля
Re: Пакетная обработка с bash?
« Ответ #21 : 25 Июня 2012, 14:20:39 »
Все не осилил, но вместо монструозной конструкции собирания длинных имен по кусочкам, можно попробовать:
ls | while read line; do echo $line; done
А можете рассказать об этом по подробнее?  ???
Как пользоваться такой конструкцией?
« Последнее редактирование: 25 Июня 2012, 14:23:34 от Zhook »
Эх!Думаете шесть маленьких лапок на одну большую клавиатуру - это удобно??!

Оффлайн Vitsliputsli

  • Старожил
  • *
  • Сообщений: 1293
    • Просмотр профиля
Re: Пакетная обработка с bash?
« Ответ #22 : 25 Июня 2012, 14:29:56 »
Куда подробнее?
Может я неправильно понял, есть такой код:
AVIS=$(ls $packdirname | grep -i ".avi")
for line in $AVIS ;
do
   echo $line # эта часть условно
done
он разные части имени с пробелами выведет на разных строчках.

А такой:
ls $packdirname | grep -i ".avi" | while read line; do echo $line; done
каждое имя на своей строчке.

Или я что-то упустил?

Оффлайн Zhook

  • Автор темы
  • Участник
  • *
  • Сообщений: 182
  • Super Zhook. Xubuntu 12.04; GIMP 2.8; Pentium 4; Geforce 6600.
    • Просмотр профиля
Re: Пакетная обработка с bash?
« Ответ #23 : 27 Июня 2012, 14:26:03 »
Это я сразу не понял, как применять.
Спасибо! А то я ждал, ждал ответа, не дождался - соорудил своё(как смог).

Пользователь решил продолжить мысль 28 Июня 2012, 14:01:34:
Сделал как советует Vitsliputsli.
Кода явно стало меньше и он стал удобнее к чтению!!! :)
Изменил систему параметров и добавил профили.
(Нажмите, чтобы показать/скрыть)
Дальше буду выкладывать по ходу доработки.
« Последнее редактирование: 28 Июня 2012, 18:14:28 от Zhook »
Эх!Думаете шесть маленьких лапок на одну большую клавиатуру - это удобно??!

 

Страница сгенерирована за 0.033 секунд. Запросов: 27.