powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / спортивный вопрос по bash
10 сообщений из 10, страница 1 из 1
спортивный вопрос по bash
    #33392357
Pavel Kilevatyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня.
Вопрос чисто спортивный. Задачу можно решить с помощью перла, но хочется обойтись башем и, если необходимо, минимумом системного ПО.

В Slackware можно использовать систему обновления swaret. Особенность реализации заключается в том, что пакеты кэшируются в определенном каталоге. Раздражают две вещи. Первая - иногда догруженные пакеты бывают поломаны, а вторая - накопление пакетов со старыми версиями.

Первая проблема решается методом:
Код: plaintext
1.
2.
3.
for package in /var/lib/swaret/*.tgz;  do
    tar -ztf $package &> /dev/null || (echo "Файл " $package " испорчен. Удаляю." && rm $package)
done

А автоматизация удаления устаревших пакетов мне не приходит в голову. Фрагмент листинга каталога привожу ниже:

aaa_base-10.1.0-noarch-2.tgz
aaa_base-10.2.0-noarch-1.tgz
aaa_base-10.2.0-noarch-2.tgz
aaa_elflibs-10.1.0-i486-1.tgz
aaa_elflibs-10.2.0-i486-1.tgz
aaa_elflibs-10.2.0-i486-2.tgz
aaa_elflibs-10.2.0-i486-3.tgz
acpid-1.0.4-i486-2.tgz
arts-1.4.0-i486-1.tgz
arts-1.4.2-i486-1.tgz
aspell-0.60.2-i486-1.tgz
aspell-0.60-i486-2.tgz
aspell-en-6.0_0-noarch-3.tgz
atk-1.9.1-i486-1.tgz
automake-1.9.5-noarch-1.tgz
bash-3.0-i486-2.tgz
bash-3.0-i486-3.tgz
bin-10.2-i486-1.tgz
bind-9.3.1-i486-1.tgz
binutils-2.15.92.0.2-i486-2.tgz
binutils-2.15.92.0.2-i486-3.tgz
bison-1.875d-i486-1.tgz
bzip2-1.0.3-i486-1.tgz
ccache-2.4-i486-1.tgz
clisp-2.34-i486-1.tgz
cvs-1.11.18-i486-1.tgz
cvs-1.11.20-i486-1.tgz
cvs-1.11.21-i486-1.tgz
cxxlibs-5.0.7-i486-1.tgz
cyrus-sasl-2.1.21-i486-1.tgz
dcron-2.3.3-i486-5.tgz
devs-2.3.1-noarch-22.tgz
distcc-2.18.3-i486-1.tgz
distcc-2.18.3-i486-2.tgz
dnsmasq-2.20-i486-1.tgz
dnsmasq-2.22-i486-1.tgz
doxygen-1.4.0-i486-1.tgz
doxygen-1.4.3-i486-1.tgz
doxygen-1.4.4-i486-1.tgz
e2fsprogs-1.38-i486-2.tgz
esound-0.2.35-i486-1.tgz
espgs-8.15rc2-i486-1.tgz
espgs-8.15rc3-i486-1.tgz
espgs-8.15rc3-i486-2.tgz


Как бы такое сообразить, что б оставить только последние версии?
...
Рейтинг: 0 / 0
спортивный вопрос по bash
    #33392463
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так пойдет?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
]# awk -F- '{ print $1}' file.txt | sort -u | while read pkg; do grep $pkg file.txt | sort | tail - 1  ;  done
aaa_base- 10 . 2 . 0 -noarch- 2 .tgz
aaa_elflibs- 10 . 2 . 0 -i486- 3 .tgz
acpid- 1 . 0 . 4 -i486- 2 .tgz
arts- 1 . 4 . 2 -i486- 1 .tgz
aspell-en- 6 .0_0-noarch- 3 .tgz
atk- 1 . 9 . 1 -i486- 1 .tgz
automake- 1 . 9 . 5 -noarch- 1 .tgz
bash- 3 . 0 -i486- 3 .tgz
binutils- 2 . 15 . 92 . 0 . 2 -i486- 3 .tgz
bind- 9 . 3 . 1 -i486- 1 .tgz
binutils- 2 . 15 . 92 . 0 . 2 -i486- 3 .tgz
bison- 1 .875d-i486- 1 .tgz
bzip2- 1 . 0 . 3 -i486- 1 .tgz
ccache- 2 . 4 -i486- 1 .tgz
clisp- 2 . 34 -i486- 1 .tgz
cvs- 1 . 11 . 21 -i486- 1 .tgz
cxxlibs- 5 . 0 . 7 -i486- 1 .tgz
cyrus-sasl- 2 . 1 . 21 -i486- 1 .tgz
dcron- 2 . 3 . 3 -i486- 5 .tgz
devs- 2 . 3 . 1 -noarch- 22 .tgz
distcc- 2 . 18 . 3 -i486- 2 .tgz
dnsmasq- 2 . 22 -i486- 1 .tgz
doxygen- 1 . 4 . 4 -i486- 1 .tgz
e2fsprogs- 1 . 38 -i486- 2 .tgz
esound- 0 . 2 . 35 -i486- 1 .tgz
espgs- 8 .15rc3-i486- 2 .tgz
...
Рейтинг: 0 / 0
спортивный вопрос по bash
    #33392497
Pavel Kilevatyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем идея понятна.
Правда приведенный пример кода удалит пакет aspell и оставит только словарь.
но это уже с полями пободаться надо.

Спасибо.
...
Рейтинг: 0 / 0
спортивный вопрос по bash
    #33392509
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда начни так
Код: plaintext
cat file.txt | sed s/[0-9]/\\t/g  | awk '{ print $1 }' | sort -u
...
Рейтинг: 0 / 0
спортивный вопрос по bash
    #33394005
Pavel Kilevatyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за проявленный интерес.
К сожалению Ваш вариант выдает список файлов, которые надо оставить. По смыслу надо вывести список файлов, подлежащих удаелнию. Вот мой вариант:
Код: plaintext
1.
2.
3.
4.
ls - 1  *.tgz | sed s/-[ 0 - 9 ]/\\t/g | awk '{ print $1 }' | sort -ru | \
 while read pkg; do
    ls - 1  $pkg\-* | head -n - 1 
 done

Оба решения страдают одной ошибкой. В выше приведенном списке выражению ls -1 aspell-* удовлетворяют 3 записи, а aspell-en-* - одна. При последовательном проходе будут удалены оба пакета aspell.

Попробую еще дома поиграть на эту тему.
...
Рейтинг: 0 / 0
спортивный вопрос по bash
    #33394579
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй еще такое произведение
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#!/bin/sh
cat file.txt | sed s/[ 0 - 9 ]/\\t/g  | awk '{ print $1 }' | sort -u | while read pkg; do
grep $pkg file.txt |  awk ' { ch=substr($0,length("'$pkg'")+1,1); if ( ch>="0" && ch<="9" ) print $0; else next; }' | sort | tail - 1 
#break
done | tee new_pkg.lst
cat file.txt | egrep -v -x -f new_pkg.lst | tee old_pkg.lst
echo check
wc -l new_pkg.lst
wc -l old_pkg.lst
wc -l file.txt
...
Рейтинг: 0 / 0
спортивный вопрос по bash
    #33394625
sanek842
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
небольшое уточнение

вот например в запрос-е
Код: plaintext
1.
2.
3.
4.
5.
# cat file.txt | grep aaa_elflibs- | sort
aaa_elflibs-10.1.0-i486-1.tgz
aaa_elflibs-10.2.0-i486-1.tgz
aaa_elflibs-10.2.0-i486-2.tgz
aaa_elflibs-10.2.0-i486-3.tgz

видно что последняя запись явл. самым новым пакетом

а вот здесь
Код: plaintext
1.
2.
3.
]# cat file.txt | grep aspell-0 | sort
aspell-0.60.2-i486-1.tgz
aspell-0.60-i486-2.tgz

что то я нессображу, что новее?
если aspell-0.60-i486-2.tgz, то приведенный выше скрипт должен работать правильно, впротивном случае со всей это катавальсией получается какой то непонятный замут
...
Рейтинг: 0 / 0
спортивный вопрос по bash
    #33394716
Pavel Kilevatyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sanek842
а вот здесь
Код: plaintext
1.
2.
3.
]# cat file.txt | grep aspell-0 | sort
aspell-0.60.2-i486-1.tgz
aspell-0.60-i486-2.tgz

что то я нессображу, что новее?
если aspell-0.60-i486-2.tgz, то приведенный выше скрипт должен работать правильно, впротивном случае со всей это катавальсией получается какой то непонятный замут

aspell-0.60-i486-2.tgz - более новый вариант по дате и по ls -1v asp*
...
Рейтинг: 0 / 0
спортивный вопрос по bash
    #33395768
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чтобы правильно отработать имена типа

aspell-0.60-i486-2.tgz
aspell-0.60.2-i486-1.tgz
aspell-en-6.0_0-noarch-3.tgz

надо сначала пропарсить и выделить имя каждого пакета
те для третьего оно будет "aspell-en"
а для первых двух "aspell"
это значит что нельзя идти awk-ом по разделителю тупо
а надо например принять условие что строка-разделитель-строка и тд
составляют имя при устови что строка не содержит только буквы и точки (признак версии). И имя считать от начала - как только встретится версия - перкращаем. Потом собрать имена и по каждому уже собрать поля версий и сравнивать.
В общем хотя бы скрипт на awk надо делать...

(imho)
...
Рейтинг: 0 / 0
спортивный вопрос по bash
    #33403955
Pavel Kilevatyh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--чтобы правильно отработать имена типа

aspell-0.60-i486-2.tgz
aspell-0.60.2-i486-1.tgz
aspell-en-6.0_0-noarch-3.tgz

надо сначала пропарсить и выделить имя каждого пакета
те для третьего оно будет "aspell-en"
а для первых двух "aspell"
это значит что нельзя идти awk-ом по разделителю тупо
а надо например принять условие что строка-разделитель-строка и тд
составляют имя при устови что строка не содержит только буквы и точки (признак версии). И имя считать от начала - как только встретится версия - перкращаем. Потом собрать имена и по каждому уже собрать поля версий и сравнивать.
В общем хотя бы скрипт на awk надо делать...

(imho)

Мда. Я уже сам убедился, что задача в общем случае гораздо более сложная чем кажется.
Спасибо за проявленный интерес.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Unix-системы [игнор отключен] [закрыт для гостей] / спортивный вопрос по bash
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]