apt-cache pkgnames

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

Post autor: jang »

Zaczynam się zastanawiać czy uda mi się kiedykolwiek dokończyć to co przy Twojej pomocy zacząłem :-(

Najpierw chciałem pomóc sobie poprzez : apt-cache pkgnames - nie da rady.
Ty umalowałeś śliczny skrypcik który robi to co powinien :-) . Ja go znowu troszkę zmodernizowałem (napewno da się lepiej ale jest dobrze):

Kod: Zaznacz cały

for x in $paczka; do 
    apt-cache show "$x" | sed '/Filename:/!d;' | sed -e 's/Filename: //' >> /tmp/spis-deb
done 
sort /tmp/spis-deb -o /tmp/spis-deb
dodałem : sed -e 's/Filename: //' a dzięki sort odkryłem kolejny problem :-( który tym razem zawdzięczam dobrym ludziom od Kadu. Umieścili swój program i dodatki (na swoim serwerze) w katalogu pkgs/etch no i mini skrypcik (ścieżka do pliku to wynik mojej modyfikacji) zapisuje do pliku m.in. :

Kod: Zaznacz cały

pkgs/etch/kadu_0.5.0-1_i386.deb
pkgs/etch/kadu-artssound_0.5.0-1_i386.deb

pool/contrib/f/flashplugin-nonfree/flashplugin-nonfree_9.0.31.0.4_i386.deb
pool/contrib/m/msttcorefonts/msttcorefonts_1.8_all.deb
chodzi o te 2 pierwsze linie, reszta już jest dobrze. Przecież na żadnym obrazie nie ma katalogu /pkgs.
Po co ścieżka do pliku ? Ze względu na to iż apt-cache pkgnames nie działa w tym wypadku chciałem sobie pakiety w ten sposób ściągnąć z ISO (przed chwilą skończył się pobierać pierwszy obraz DVD) ale jak takich "dziwnych" ścieżek będzie więcej ? Wiem można by było się ich pozbyć ale co to za skrypt jak za każdym razem każdy użytkownik będzie musiał porównywać dpgk -l z tym co w reprepro skrypt mu zainstalował ? (Chciałem cały skrypt udostępnić tym którzy będą mieli ochotę z reprepro skorzystać) Będę musiał wymyślić jakiś inny sposób, jaki nie wiem, o tej godzinie mózg już mi nie pracuje.

Pozdrawiam
Gość

Post autor: Gość »

[bAd. 1 [/b]
jang pisze:Ja go znowu troszkę zmodernizowałem (na pewno da się lepiej ale jest dobrze):

Kod: Zaznacz cały

for x in $paczka] dodałem: [b] sed -e 's/Filename: //'[/b][/quote]
Nie używaj 2 razy polecenia [b]sed[/b], bo to powoduje, że 2 razy musi ono być wywoływane - rób to jednym ciągiem, a [b]sort[/b] dodaj do potoku:[code]for x in $paczka; do
    apt-cache show "$x" \
    | sed '/Filename:/!d;{s/.*:\ //}' \
    | sort >>$lista
done
Ad. 2
jang pisze:odkryłem kolejny problem, który tym razem zawdzięczam dobrym ludziom od Kadu. Umieścili swój program i dodatki (na swoim serwerze) w katalogu pkgs/etch
To wynika z zasad budowania repozytorium.
Wymagane jest określone drzewo katalogów w dists, zaś same paczki mogą być umieszczane w dowolnym katalogu - o dowolnej nazwie.
Pule są użyteczne przy dużych repozytoriach, dlatego nie dziw się, że np.: Kadu nie stosuje pool tylko własny układ.
Sam osobiście paczki umieszczam w katalogu debs.

Jeżeli chcesz wrzucać paczki "nietypowej" lokalizacji Kadu do Twojego pool, to załóż w pool/main/ np. katalog: inne
a potem tylko zmodyfikuj znów polecenie:

Kod: Zaznacz cały

for x in $paczka]co spowoduje, że wszystkie ścieżki [b]pkgs/etch/<nazwa paczki>[/b] zostaną zamienione na [b]pool/main/inne/<nazwa paczki>[/b]
Dla większej ilości "dziwnych" lokalizacji zmodyfikuj sobie to aby wyszukiwało linie zaczynające się inaczej niż [b]pool/[/b] , wycinało wszystko aż do nazwy pakietu i podmieniało na wpis ze ścieżką jaką sobie tam wymyślisz.
Możliwości jest mnóstwo :)
Polecam: [i]man bash[/i] i [i]man sed[/i]

Ogólnie to zaczynam się zastanawiać się czy to już się powoli nie robi temat o [b]Bash+Sed[/b]  ;)

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

Post autor: jang »

Hagal jeszcze raz dziękuję za pomoc.
Dzięki Twojemu "mini skrypcikowi" a szczególnie ostatniej modyfikacji zaczynam łapać co się dzieje w "{}" sed'a.
Pisałem wcześniej o "problemie" z Kadu a tu okazuje się że z nim nie ma żadnego problemu natomiast problemem jest chaos jaki panuje na debian-multimedia.
dzięki apt-cache showpkg ... jestem w stanie otrzymać informację o tym skąd pochodzi pakiet np.

Kod: Zaznacz cały

apt-cache showpkg opera
pokaże nam m.im. :

Kod: Zaznacz cały

Versions:
9.20-20070409.6(/var/lib/apt/lists/deb.opera.com_opera_dists_testing_non-free_binary-i386_Packages)(/var/lib/apt/lists/localhost_debian_dists_lenny_non-free_binary-i386_Packages)(/var/lib/dpkg/status)
czyli wiadomo że pochodzi z deb.opera.com/opera
natomiast za pomocą :

Kod: Zaznacz cały

apt-cache showpkg opera
jestem w stanie dowiedzieć się jaka jest ścieżka do pakietu na serwerze :

Kod: Zaznacz cały

Filename: pool/non-free/o/opera/opera_9.20-20070409.6_i386.deb
czyli składając to wszystko w całość mogę sobie przy pomocy wget ściągnąć każdy pakiet z konkretnego serwera :

Kod: Zaznacz cały

wget --tries=45 [url]http://deb.opera.com/opera/pool/non-free/o/opera/opera_9.20-20070409.6_i386.deb[/url] -P /var/cache/apt/archives/
a co za chaos na debian multimedia ? ano taki że dzięki apt-cache showpkg ... i apt-cache show ... można się co najwyżej dowiedzieć że pakiet pochodzi z "www.debian-multimedia.org" a zamiast np. pool/non-free/o/opera/opera_9.20-20070409.6_i386.deb dostajemy takie cudo :1:20061022-0.0 (/var/lib/dpkg/status) czyli ścieżka dostępu do pakietu na serwerze jest tajemnicą państwową.

a oto ostatnia moja wersja skryptu dzięki której wszystko wyszło na jaw :

Kod: Zaznacz cały

#!/bin/bash 

echo `date`

echo -n > /tmp/spis-deb3

paczka="$(dpkg -l | grep '^ii ' | awk '{print $2}')" 
lista="/tmp/spis-deb3" 

for x in $paczka; do 
#    apt-cache showpkg "$x" | sed '/(\/var\/lib/!d;{s/.*lists\///};/dists/{s/dists.*//g};/_/{s/_/\//g};/Packages)/{s/Packages)//g};' >> $lista
    a="$(apt-cache showpkg "$x" | sed '/(\/var\/lib/!d;/lists/{s/.*lists/http:\//g};/dists/{s/dists.*//g};/_/{s/_/\//g};/Packages)/{s/Packages)//g};')"
    b="$(apt-cache show "$x" | sed '/Filename:/!d;{s/.*:\ //}')"
    echo "$a$b" >> $lista
done

sort /tmp/spis-deb3 -o /tmp/spis-deb3

echo "Zapisano $(wc -l <$lista) pozycji"

echo `date`
a to wynik działania skryptu :

Kod: Zaznacz cały

http://ftp.pl.debian.org/debian/pool/contrib/f/flashplugin-nonfree/flashplugin-nonfree_9.0.31.0.4_i386.deb
[url]http://ftp.pl.debian.org/debian/pool/contrib/m/msttcorefonts/msttcorefonts_1.8_all.deb[/url]
[url]http://ftp.pl.debian.org/debian/pool/main/a/a52dec/liba52-0.7.4_0.7.4-11_i386.deb[/url]
[url]http://ftp.pl.debian.org/debian/pool/main/a/aalib/libaa1_1.4p5-31_i386.deb[/url]
[url]http://ftp.pl.debian.org/debian/pool/main/a/acl/libacl1_2.2.42-1_i386.deb[/url]
[url]http://ftp.pl.debian.org/debian/pool/main/a/acpid/acpid_1.0.4-7.1_i386.deb[/url]
...
...
...
[url]http://ftp.pl.debian.org/debian/pool/non-free/r/rar/rar_3.7b1-2_i386.deb[/url]
[url]http://ftp.pl.debian.org/debian/pool/non-free/u/unrar-nonfree/unrar_3.7.3-1_i386.deb[/url]
[url]http://localhost/debian/pool/main/k/knetstats/knetstats_1.6-1_i386.deb[/url]
[url]http://localhost/debian/pool/main/w/w32codecs/w32codecs_20061022-0.0_i386.deb[/url]
[url]http://localhost/debian/pool/non-free/o/opera/opera_9.20-20070409.6_i386.deb[/url]
[url]http://www.kadu.net/download/binary/debian/repo/pkgs/etch/kadu-artssound_0.5.0-1_i386.deb[/url]
Sortowanie znowu osobno bo niestety tym sposobem plik nie jest posortowany :

Kod: Zaznacz cały

apt-cache show "$x" \ 
    | sed '/Filename:/!d;{s/.*:\ //};/^pkgs/{s/pkgs\/etch/pool\/main\/inne/g}' \ 
    | sort >>$lista
Pozdrawiam[/code]
ODPOWIEDZ