bash i pakiety .deb

Potrzebujesz pomocy z C, C++, perl, python, itp.
jang
Beginner
Posty: 208
Rejestracja: 26 stycznia 2007, 14:38

bash i pakiety .deb

Post autor: jang »

Witam

Chciałbym napisać skrypt który będzie:
1. wczytywał nazwy pakietów (z /var/cache/apt/archives) zapisywał je do pliku ( /tmp/spis-deb)
2. na podstawie powyższej listy będzie odczytywał nazwę i wersję pakietu
3. przy pomocy listy z pkt.2 ma wykasować z /var/cache/apt/archives starsze wersje tego samego pakietu
4. cdn jak uporam się z ... :

Kod: Zaznacz cały

#! /bin/bash

ls -1v /var/cache/apt/archives > /tmp/spis-deb

cat /tmp/spis-deb | grep -v '#' | while read line; do

dpkg-deb -W /var/cache/apt/archives/`echo "$line" | awk '{print $1}'`;

done; 
Powyższy kod wykonuje to co założyłem sobie w punktach 1 i 2 ale nie do końca tak jak chciałbym tzn.
- pakuje mi również do tej pierwszej listy nazwę katalogu "/partial" i podejrzewam że gdyby coś w nim było to i jego zawartość również by mi dopisał
- trafił mi się również pakiet o zerowej zawartości i jego też dopisał (rzadko mi się to przytrafia ale czasami przy apt-get update ,upgrade mam przekroczony czas połączenia czy jakoś tak i pewnie dlatego ten "zerowy" pakiet)

No i czas na pytania:
1. Co zmienić aby skrypt nie wczytywał ani nazwy katalogu /partial ani jego zawartości ? no i pustych plików również nie
2. Mając tą drugą listę (część zawartości) :

Kod: Zaznacz cały

apt     0.6.46.4-0.1
aptitude        0.4.4-1
aptitude        0.4.4-4
avahi-daemon    0.6.16-5
util-linux      2.12r-19
vim-common      1:7.0-122+1
vim-common      1:7.0-219+1
vim-tiny        1:7.0-122+1
vim-tiny        1:7.0-219+1
w32codecs       1:20061022-0.0
jak pozbyć się starszych pakietów, tzn jak wykonać takie porównanie na podstawie powyższych wpisów - który starszy to do kasowania a nowszy pozostaje.
Oczywiście sugestie dotyczące całkowicie innego podejścia do problemu również mile widziane :)

Pozdrawiam
velmafia
Member
Posty: 1820
Rejestracja: 01 września 2006, 00:56
Lokalizacja: Las

Post autor: velmafia »

a po co pisać skrypt? no chyba że robisz to ze względu na naukę.


przecież polecenie:

Kod: Zaznacz cały

aptitude autoclean
robi to co Ty chcesz osiągnąć, a mianowicie usuwa starsze wersje pakietów z /var/cache/apt/archives.

właśnie przedstawiłem:
jang pisze: sugestie dotyczące całkowicie innego podejścia do problemu
;)


aloha
Lorenzo
Beginner
Posty: 262
Rejestracja: 15 sierpnia 2006, 16:14
Lokalizacja: Kraków

Re: bash i pakiety .deb

Post autor: Lorenzo »

jang pisze: 1. wczytywał nazwy pakietów (z /var/cache/apt/archives) zapisywał je do pliku ( /tmp/spis-deb)
spróbuj tak:

Kod: Zaznacz cały

echo -n > /tmp/spis-deb #tworzy pusty plik, lub zamazuje stary
for I in /var/cache/apt/archives/*.deb ]
Z resztą powinno już pójśc gładko

//edit:
jeżeli masz listę pakietów w /var/.... i z dpkg -l  to użyj diff'a do porównania. A potem grepy, cuty, cuda, wianki ;-)
jang
Beginner
Posty: 208
Rejestracja: 26 stycznia 2007, 14:38

Post autor: jang »

velmafia dziękuję.
Starożytni :-P Indianie mieli jednak rację: Człowiek głupi się rodzi i głupi umiera.

Traktuję nie tylko basha ale Linuksa w całości jako hobby, a po co mi ten skrypt? To ma być "pomocnik" do reprepro. Jak kiedyś uda mi się go zrobić w całości to w FAQ opiszę (jak mnie ktoś nie uprzedzi) i reprepro i ten skrypt bo ręcznie wpisywać tyle pakietów ani myślę. W reprepro nie da się jak z aptem - apt-get install libc6 tylko trzeba w całości o tak:

Kod: Zaznacz cały

reprepro -Vb . includedeb pcpool /var/cache/apt/archives/libc6_2.2.5-11.8_i386.deb
no i oczywiście wcześniej:

Kod: Zaznacz cały

reprepro -Vb . -C main -A i386 remove pcpool libc6
Trochę to męczące i dlatego ten skrypcik.

Lorenzo, faktycznie teraz nie wczytuję mi ani katalogu ani jego zawartością - bardzo dziękuję.
Mam jednak jeszcze jedno pytanie, te moje parę linijek wymyśliłem sam (przeglądając inne skrypty) więc wiem o co chodzi natomiast nie bardzo wiem z czym kojarzyć te f1 f2 f6? Do jakiego info (man) powinienem zajrzeć?
Gość

Post autor: Gość »

jang pisze:nie bardzo wiem z czym kojarzyć te f1 f2 f6? Do jakiego info (man) powinienem zajrzeć?

Kod: Zaznacz cały

man cut
opcje:
--delimiter
--fields

Pozdrawiam.
jang
Beginner
Posty: 208
Rejestracja: 26 stycznia 2007, 14:38

Post autor: jang »

Hagal pisze:

Kod: Zaznacz cały

man cut
opcje :
--delimiter
--fields
Tak też myślałem i nawet już wcześniej tam zaglądnąłem ale...
1 i 2 skojarzyłem po efektach pracy tego skryptu ale skąd ta 6 ? Nic nie przychodzi mi do głowy. Czy mógłby mnie ktoś oświecić ?
Tak przy okazji dlaczego ":" jest zamieniany na "%3" ? tzn.
sposobem który był uprzejmy podrzucić Lorenzo w pliku spis-deb mam np.:
wodim 9%3a1.1.4-1
natomiast "moim" sposobem (wyciągając wersję za pomocą dpkg-deb) otrzymuję :
wodim 9:1.1.4-1
???
Lorenzo
Beginner
Posty: 262
Rejestracja: 15 sierpnia 2006, 16:14
Lokalizacja: Kraków

Post autor: Lorenzo »

cut -d '/' -f6

Ustawia separator na /, zaś -f6 wybiera 6 ciąg znaków oddzielony separatorem (liczy od ciągu znaków przed separatorem). U mnie efekt jest taki:
apt-file 2.0.8.2
bochsbios 2.3-2
debootstrap 0.3.3.2
dhcp-client 2.0pl5-19.5
dvgrab 1.8-4
gfxboot-theme-elive 0.3
Natomiast %3 - występuje w nazwie pliku deb, zaś dpkg interpretuje to jako : w werji.
jang
Beginner
Posty: 208
Rejestracja: 26 stycznia 2007, 14:38

Post autor: jang »

Lorenzo pisze:U mnie efekt jest taki:
U mnie efekt jest dokładnie taki sam :-)
Lorenzo pisze:cut -d '/' -f6
(liczy od ciągu znaków przed separatorem).
Teraz wszystko jasne :)
Pakiet na pozycji 5 a tam 6 ? jakoś nie umiałem się tego doliczyć :-| tzn wpisałem 5 i zacząłem łapać o co chodzi ale wolałem się upewnić :-)

Lorenzo dziękuję i pozdrawiam
ODPOWIEDZ