Доброго времени суток, Господа линуксоиды!
Требуется помощь по написанию скрипта, задали в универе, сам в них не силён и времени разбираться нет.Задание:
Сценарий обрабатывает, поступающий ему на стандартный ввод плейлист и удаляет несуществующие или недоступные файлы. Результат выдаётся на стандартный вывод.
$ 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Заранее благодарен за помощь!
>[оверквотинг удален]
> #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
Похоже я с утра не правильно понял задачу, и скрипт наоборот удалял те файлы которые в плейлисте есть, а которых нет оставлял, ну да ладно, вот, точно то что вам надо, проверяет плейлист, если файл есть и доступен на чтение он его оставит, если файла нет или он не доступен на чтение, он его удаляет.#!/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 < $1if [ "$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 < tmprm -f tmp
Огромное спасибо!!
Даже не думал что так скоро помогут)
> если файла нет ......, он его удаляет.Вау. Параненормальные явления 3.
Автор наверно имел ввиду удаляет из плейлиста. (ака не выводит на stdout)awk '{split($0,a,": "); print a[1]}'` толсто.
cut -d: -d' ' -f2-
>> если файла нет ......, он его удаляет.
> Вау. Параненормальные явления 3.
> Автор наверно имел ввиду удаляет из плейлиста. (ака не выводит на stdout)
> awk '{split($0,a,": "); print a[1]}'` толсто.
> cut -d: -d' ' -f2-Автор сделал то, что просил его другой автор, и попробуйте прочитать всю фразу целиком, а не выдернув из контекста пару слов, сразу начинать снимать новый фильм.
По поводу awk или cut... Мне больше нравиться awk, вам похоже сut, так вот пользуйтесь им дальше на здоровье.
>>> если файла нет ......, он его удаляет.
>> Вау. Параненормальные явления 3.
>> Автор наверно имел ввиду удаляет из плейлиста. (ака не выводит на stdout)
>> awk '{split($0,a,": "); print a[1]}'` толсто.
>> cut -d: -d' ' -f2-
> Автор сделал то, что просил его другой авторЧто он сделал???
done < $1 - это что за ....
> Автор сделал то, что просил его другой автор, и попробуйте прочитать всю
> фразу целиком,"Требуется помощь по написанию скрипта"
Про использование внешних программ, типа 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.m3upavel@suse64:/tmp> ./test.sh < xmms.m3u
LINKIN PARK - PAPERCUT.MP3
LINKIN PARK - NUMB.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Эхх, вот и я не люблю когда люди излагают свои мысли в странной языковой форме, из-за этого и возникают все недопонимания.
В общем, изначально я так же как и вы подумал что автору необходимо чего-то там удалять, что находиться в неком списке. Но, немного обдумав его слова, я понял, что ему необходимо:1. Прочитать каталог
2. Сравнить содержимое каталога и список в файле
3. Удалить все те файлы которые -
а. Не в списке
б. Те которые нельзя прочесть. Что под этим подразумевает автор, не совсем понятно. Но я предположил что Not readble то удаляем.
4. Так же просили как можно больше визуальной информации.Учитывая, то, что автор не хочет сам учить bash, я предположил, что стоит написать все как можно проще и доступней, иначе преподаватель заподозрит и наши старания приведут автора на нелегкий путь исправления.
> В общем, изначально я так же как и вы подумал что автору
> необходимо чего-то там удалять, что находиться в неком списке.
> Но, немного обдумав его слова, я понял, что ему необходимо:
> 1. Прочитать каталог
> 2. Сравнить содержимое каталога и список в файлеЯ понял так, что нужна приблуда которая обновляет плейлист.
То есть читает существующий, проверяет наличие и пишет в stdout,
если файл на месте, иначе молчит.
Ладно, хрен с ним, видимо уже зачёт сдал и спит спокойно. :)
Заглянул щас в тему случайно, заметил интересное обсуждение, решил отписаться.Собственно в 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
doneness@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.mp3ness@ness ~/Рабочий стол/bash $ ls
IN THE END.mp3 myscript.sh ONE STEP CLOSER.mp3 pl.m3uness@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Собственно возникла проблема в том что оказывается при таком способе запуска скрипта, я имею в виду перенаправление плейлиста тем способом что указан выше, я не могу изменить его, тобишь удалить и записать его по новой, по причине того что никак не могу узнать его имя, поузнавал оказывается что это вобще не осуществимо.
.