|xed| 17.09.2009 12:10
Скрипты на bash — пару вопросов...
пишу скриптики и иногда возникают довольно простые вопросы,но из за не дружбы с программированием и не знание некоторых фишек (синтаксиса итд) - возникают непонятки =(собственно обращаюсь к вам.
1.пишу скрипт который будет конвертировать видео<�РЕШЕНО!>
есть проблемы, если файлы с пробелами то скрипт не работает =(
ls -1
Ohotnik 1.avi
tes t.mkv
Перевозчик 3.mkv
а вот выполнение скрипта с за комментированной строчкой (mencoder $i -oac lavc -ovc lavc -o $NEWFILE)
newfile=Ohotnik file=Ohotnik
newfile=1_new.avi file=1.avi
newfile=tes file=tes
newfile=t_new.avi file=t.mkv
newfile=Перевозчик file=Перевозчик
newfile=3_new.avi file=3.mkv
РАБОЧИЙ ВАРИАНТ
Спасибо:zivot_je_cudo,n0p, muhas, и всем кто принимал участие.
2.пишу скрипт которые будет создавать симлинки для видео фалов.
#!/bin/bash
DIR_OUT=/mnt/film/
DIR_IN=/mnt/video/
for i in `cd $DIR_OUT && ls *.avi`
do
ln -s $DIR_OUT$i $DIR_IN$i
done
-но тут опять возникает проблема с пробелами в файлах (такая же что и выше)
-в катологе /mnt/film/ с не большой периодичностью удаляются файлы, те симлинки в каталоге /mnt/video/ дохнут ... следовательно надо проверять симлинки в каталоге на актуальность и дохлые ссылки удалять...вопрос как? проверить дохлая ли ссылка (желательно с примерами)

+ 3 -
Заключай переменный в "-кавычки.
Как-нибудь так:
#!/bin/bash
< -x $1 > && PATHdr=$1
for i in $PATHdr*.{mkv,avi,mpeg}; do
NEWFILE=`echo "$i"|sed -e 's/\.(avi|mkv|mpeg)/_new\.avi/' `
echo "newfile=$NEWFILE" "file=$i"
#mencoder "$i" -oac lavc -ovc lavc -o "$NEWFILE"
done
Еще раз.
<16:20:30>:: $ ls -1 | grep .avi
В ожидании чуда.avi
Вся белка (Ледниковый период).avi
День выборов - спектакль театра Квартет И.avi
День радио.avi
Каникулы строгого режима (Игорь Зайцев) <2009 г., Комедия, DVDRip>.avi
<16:20:34>:: $ for i in `ls | grep .avi` ; do echo "$i" ; done
В
ожидании
чуда.avi
Вся
белка
(Ледниковый
период).avi
День
выборов
спектакль
театра
Квартет
И.avi
День
радио.avi
Каникулы
строгого
режима
(Игорь
Зайцев)
<2009
г.,
Комедия,
DVDRip>.avi
Объясню понятнее, второй строкой выполняй for i in "`ls | grep .avi`" ; do echo "$i" ; done.
Тогда получается, что вышеприведенный код все-равно не совсем верен, должно быть как-то так:
#!/bin/bash
< -x $1 > && PATHdr=$1
for i in "$PATHdr*.{mkv,avi,mpeg}"; do
NEWFILE=`echo "$i"|sed -e 's/\.(avi|mkv|mpeg)/_new\.avi/' `
echo "newfile=$NEWFILE" "file=$i"
#mencoder "$i" -oac lavc -ovc lavc -o "$NEWFILE"
done
Хитрые все какие :)
Конструкция for $i in `cmd` разгребает вход по разделителю. А разделитель сей - любой whitespace или перенос строки. Т.е. табы, пробелы, конец строки - все это разделитель в данном случае. И куда вы хотите кавычки приткнуть?
Я в подобных ситуациях выхожу из положения следующей конструкцией:
Ужасное решение, я знаю :) Но работает :)
Конструкция for $i in `cmd` разгребает вход по разделителю. А разделитель сей - любой whitespace или перенос строки. Т.е. табы, пробелы, конец строки - все это разделитель в данном случае. И куда вы хотите кавычки приткнуть?
Я в подобных ситуациях выхожу из положения следующей конструкцией:
ls -1 ./ > /tmp/list
TMPFILE=/tmp/list
COUNT=`cat -n $TMPFILE | tail -n 1 | awk '{print $1}'`
I=1
while < $i -le $COUNT > ; do
FILE=`head -n $I $TMPFILE | tail -n 1`
# имеем имя файла :)
echo "$FILE"
let I=$I+1
done
rm -f $TMPFILE
Ужасное решение, я знаю :) Но работает :)
Удаление нерабочих симлинков на основе их нулевой длинны:
#!/bin/bash
for i in $DIR_IN/*; do
< -s "$i" > || rm "$i"
done
Коряво получилось, лучше так:
#!/bin/bash
for i in *; do
< -h "$i" -a ! -s "$i" > && rm "$i"
done
ls pach_to| while read i
do
blablabla
done
каждая строка это файл. ну и кавычки не забываем в параметрах к mencoder