URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8934
[ Назад ]

Исходное сообщение
"Помогите сделать скрипт"

Отправлено nessptz , 23-Ноя-10 15:14 
Доброго времени суток, Господа линуксоиды!
Требуется помощь по написанию скрипта, задали в универе, сам в них не силён и времени разбираться нет.

Задание:

Сценарий обрабатывает, поступающий ему на стандартный ввод плейлист и удаляет несуществующие или недоступные файлы. Результат выдаётся на стандартный вывод.

$ cat xmms.m3u
#EXTM3U
#EXTINF: LINKIN PARK - IN THE END.MP3
#EXTINF: LINKIN PARK - PAPERCUT.MP3
#EXTINF: LINKIN PARK - NUMB.MP3

$ls

IN THE END.MP3
NUMB.MP3

$./myscript.sh < xmms.m3u
#EXTM3U
#EXTINF: LINKIN PARK - IN THE END.MP3
#EXTINF: LINKIN PARK - NUMB.MP3

Заранее благодарен за помощь!


Содержание

Сообщения в этом обсуждении
"Помогите сделать скрипт"
Отправлено edd , 23-Ноя-10 16:07 
>[оверквотинг удален]
> #EXTINF: LINKIN PARK - PAPERCUT.MP3
> #EXTINF: LINKIN PARK - NUMB.MP3
> $ls
> IN THE END.MP3
> NUMB.MP3
> $./myscript.sh < xmms.m3u
> #EXTM3U
> #EXTINF: LINKIN PARK - IN THE END.MP3
> #EXTINF: LINKIN PARK - NUMB.MP3
> Заранее благодарен за помощь!

Мне конечно не жалко, и поэтому я дам вам скрипт, но все же, если вы собираетесь связать свою жизнь с IT, то настойчиво вам рекомендую найти время и начать учить bash, тем паче что он совсем не сложный.

Вот ваш скрипт:

#!/bin/bash
#
CHE="#EXTINF"
while read LINE
do
CH=`echo "$LINE"|awk '{split($0,a,": "); print a[1]}'`
if [ "$CH" == "$CHE" ]
    then
        NAME=`echo "$LINE"|awk '{split($0,a,": "); print a[2]}'`
            if [ -a "$NAME" ]
                then
                rm -f "$NAME"
                echo "Файл $NAME был удален"
                else
                echo "Файла $NAME не существует"
            fi
fi
done < $1


"Помогите сделать скрипт"
Отправлено Edd , 23-Ноя-10 20:44 
Похоже я с утра не правильно понял задачу, и скрипт наоборот удалял те файлы которые в плейлисте есть, а которых нет оставлял, ну да ладно, вот, точно то что вам надо, проверяет плейлист, если файл есть и доступен на чтение он его оставит, если файла нет или он не доступен на чтение, он его удаляет.

#!/bin/bash
#
ls -1 *.MP3 >> tmp
CHE="#EXTINF"
while read LINE1
do
COUNTER=0
    while read LINE
    do
    CH=`echo "$LINE"|awk '{split($0,a,": "); print a[1]}'`
        if [ "$CH" == "$CHE" ]
            then
                NAME=`echo "$LINE"|awk '{split($0,a,": "); print a[2]}'`
                if [ "$LINE1" == "$NAME" ]
                then
                    COUNTER=$[$COUNTER+1]
                fi
        fi
    done < $1

    if [ "$COUNTER" -ge 1 ]
    then
        echo "Файл $LINE1 в плейлисте и существует"
        if [ -r "$LINE1" ]
        then
            echo "Файл $LINE1 доступен"
        else
            rm -f $LINE1
            echo "Файл $LINE1 был не доступен для чтения"
        fi
    else
        rm -f $LINE1
        echo "Файл $LINE1 не в плейлисте и удален"
    fi
done < tmp

rm -f tmp


"Помогите сделать скрипт"
Отправлено nessptz , 24-Ноя-10 10:19 
Огромное спасибо!!
Даже не думал что так скоро помогут)


"Помогите сделать скрипт"
Отправлено pavlinux , 27-Ноя-10 21:38 
>  если файла нет ......, он его удаляет.

Вау. Параненормальные явления 3.
Автор наверно имел ввиду удаляет из плейлиста. (ака не выводит на stdout)

awk '{split($0,a,": "); print a[1]}'`  толсто.
cut -d: -d' ' -f2-



"Помогите сделать скрипт"
Отправлено Edd , 27-Ноя-10 23:15 
>>  если файла нет ......, он его удаляет.
> Вау. Параненормальные явления 3.
> Автор наверно имел ввиду удаляет из плейлиста. (ака не выводит на stdout)
> awk '{split($0,a,": "); print a[1]}'`  толсто.
> cut -d: -d' ' -f2-

Автор сделал то, что просил его другой автор, и попробуйте прочитать всю фразу целиком, а не выдернув из контекста пару слов, сразу начинать снимать новый фильм.
По поводу awk или cut... Мне больше нравиться awk, вам похоже сut, так вот пользуйтесь им дальше на здоровье.


"Помогите сделать скрипт"
Отправлено pavlinux , 28-Ноя-10 00:19 
>>>  если файла нет ......, он его удаляет.
>> Вау. Параненормальные явления 3.
>> Автор наверно имел ввиду удаляет из плейлиста. (ака не выводит на stdout)
>> awk '{split($0,a,": "); print a[1]}'`  толсто.
>> cut -d: -d' ' -f2-
> Автор сделал то, что просил его другой автор

Что он сделал???

done < $1  - это что за ....


"Помогите сделать скрипт"
Отправлено pavlinux , 28-Ноя-10 00:56 
> Автор сделал то, что просил его другой автор, и попробуйте прочитать всю
> фразу целиком,

"Требуется помощь по написанию скрипта"

Про использование внешних программ, типа sed, awk, perl, не написано.
По этому cut тоже плохо :-P


#!/bin/sh
#
# Выводит список только тех файлов которые есть и в списке и на диске.
# А то ..., awk, sed, php.  ...тфу, дёрёвня! (c) Л&Г
# И "удалять несуществующие или недоступные файлы.", это к экстрасенсам

CHE="#EXTINF"
while read LINE <&0
      do
        [ "${CHE%LINE}" == "$CHE" ] && [ -f "${LINE##*\: }" ] && echo "${LINE##*\: }";
done


pavel@suse64:/tmp> ls -1
LINKIN PARK - 1.MP3
LINKIN PARK - 3.MP3
LINKIN PARK - 5.MP3
LINKIN PARK - 7.MP3
LINKIN PARK - NUMB.MP3
LINKIN PARK - PAPERCUT.MP3
test.sh
xmms.m3u

pavel@suse64:/tmp> ./test.sh < xmms.m3u
LINKIN PARK - PAPERCUT.MP3
LINKIN PARK - NUMB.MP3


"Помогите сделать скрипт"
Отправлено Edd , 28-Ноя-10 02:49 
>[оверквотинг удален]
> LINKIN PARK - 3.MP3
> LINKIN PARK - 5.MP3
> LINKIN PARK - 7.MP3
> LINKIN PARK - NUMB.MP3
> LINKIN PARK - PAPERCUT.MP3
> test.sh
> xmms.m3u
> pavel@suse64:/tmp> ./test.sh < xmms.m3u
> LINKIN PARK - PAPERCUT.MP3
> LINKIN PARK - NUMB.MP3

Эхх, вот и я не люблю когда люди излагают свои мысли в странной языковой форме, из-за этого и возникают все недопонимания.
В общем, изначально я так же как и вы подумал что автору необходимо чего-то там удалять, что находиться в неком списке. Но, немного обдумав его слова, я понял, что ему необходимо:

1. Прочитать каталог
2. Сравнить содержимое каталога и список в файле
3. Удалить все те файлы которые -
а. Не в списке
б. Те которые нельзя прочесть. Что под этим подразумевает автор, не совсем понятно. Но я предположил что Not readble то удаляем.
4. Так же просили как можно больше визуальной информации.

Учитывая, то, что автор не хочет сам учить bash, я предположил, что стоит написать все как можно проще и доступней, иначе преподаватель заподозрит и наши старания приведут автора на нелегкий путь исправления.


"Помогите сделать скрипт"
Отправлено pavlinux , 28-Ноя-10 04:01 
> В общем, изначально я так же как и вы подумал что автору
> необходимо чего-то там удалять, что находиться в неком списке.
> Но, немного обдумав его слова, я понял, что ему необходимо:
> 1. Прочитать каталог
> 2. Сравнить содержимое каталога и список в файле

Я понял так, что нужна приблуда которая обновляет плейлист.
То есть читает существующий, проверяет наличие и пишет в stdout,
если файл на месте, иначе молчит.

Ладно, хрен с ним, видимо уже зачёт сдал и спит спокойно. :)


"Помогите сделать скрипт"
Отправлено nessptz , 06-Дек-10 02:20 
Заглянул щас в тему случайно, заметил интересное обсуждение, решил отписаться.

Собственно в bash немного разобрался, скрипт написал свой(привожу ниже), зачёт ещё не сдал))) там куча чего другого надо помимо баша


ness@ness ~/Рабочий стол/bash $ cat myscript.sh
#!/bin/bash
#
echo "#EXTM3U" > new_play_list.m3u
ls -1 *.mp3 >> tmp
cat |
while read line
do
cat tmp | while read line2    
do
if [ "$line" == "$line2" ]
then
echo "$teg" >> new_play_list.m3u
echo "$line" >> new_play_list.m3u
fi
done
teg=$line
done
rm -f tmp
cat new_play_list.m3u | while read line    
do
echo $line
done

ness@ness ~/Рабочий стол/bash $ cat pl.m3u
#EXTM3U
#EXTINF:,FAINT.mp3
FAINT.mp3
#EXTINF:,IN THE END.mp3
IN THE END.mp3
#EXTINF:,NUMB.mp3
NUMB.mp3
#EXTINF:,ONE STEP CLOSER.mp3
ONE STEP CLOSER.mp3

ness@ness ~/Рабочий стол/bash $ ls
IN THE END.mp3  myscript.sh  ONE STEP CLOSER.mp3  pl.m3u

ness@ness ~/Рабочий стол/bash $ ./myscript.sh < pl.m3u
#EXTM3U
#EXTINF:,IN THE END.mp3
IN THE END.mp3
#EXTINF:,ONE STEP CLOSER.mp3
ONE STEP CLOSER.mp3

Собственно возникла проблема в том что оказывается при таком способе запуска скрипта, я имею в виду перенаправление плейлиста тем способом что указан выше, я не могу изменить его, тобишь удалить и записать его по новой, по причине того что никак не могу узнать его имя, поузнавал оказывается что это вобще не осуществимо.


"Помогите сделать скрипт"
Отправлено pavlinux , 27-Ноя-10 21:40 
.