View previous topic :: View next topic |
Author |
Message |
Cazzantonio Bodhisattva
Joined: 20 Mar 2004 Posts: 4514 Location: Somewere around the world
|
Posted: Fri Jun 23, 2006 12:29 pm Post subject: [portage]Come ricavare il nome del pacchetto senza versione? |
|
|
Probabilmente chi di voi si diletta di bash scripting per genstire le varie eventuali del proprio sistema si è scontrato una o più volte con questo problema annoso:
Come ricavare il nome del pacchetto eliminando la versione?
Faccio un esempio per essere più chiaro:
se ho un pacchetto del tipo
<categoria>/<nome>-<versione> come faccio con un semplice script a ricavarmi <categoria>/<nome> e basta?
Sembra semplice a dirsi ma se <categoria> è sicuramente più standard come formato, <nome> può essere lungo a piacere e non è ben chiaro come separarlo dalla <versione> con un semplice "cut"
Se uno di voi risolve questo problema gli offro una birra appena passa dalle mie parti
Io per ora ho trovato solo questa soluzione estremamente poco elegante:
Code: | PIPPO=1
while [ `echo "app-admin/eselect-opengl-1.5.6-r1"|cut -d"-" -f$PIPPO |sort|uniq |grep "\."|wc -l` -eq 0 ]
do
PIPPO=$(echo "$PIPPO +1" |bc)
done
PIPPO=$(echo $PIPPO -1|bc)
echo "app-admin/eselect-opengl-1.5.6-r1" |cut -d"-" -f-$PIPPO |
ovviamente app-admin/eselect-opengl-1.5.6-r1 è solo un esempio _________________ Any mans death diminishes me, because I am involved in Mankinde; and therefore never send to know for whom the bell tolls; It tolls for thee.
-John Donne |
|
Back to top |
|
|
codadilupo Advocate
Joined: 05 Aug 2003 Posts: 3135
|
Posted: Fri Jun 23, 2006 1:15 pm Post subject: |
|
|
Code: | harlock@Alkadia ~ $ echo "gnome-extra/gnome-power-manager-2.14.2" | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1
gnome-extra/gnome-power-manager
harlock@Alkadia ~ $ |
puo' andare ?
Coda |
|
Back to top |
|
|
shogun_panda Guru
Joined: 30 Jul 2004 Posts: 411 Location: Campobasso or Rome, Molise or Lazio, Italy, Europe, Earth, Solar system, Milk Way, Universe
|
Posted: Fri Jun 23, 2006 1:18 pm Post subject: Re: [portage]Come ricavare il nome del pacchetto senza versi |
|
|
Cazzantonio wrote: | Probabilmente chi di voi si diletta di bash scripting per genstire le varie eventuali del proprio sistema si è scontrato una o più volte con questo problema annoso:
Come ricavare il nome del pacchetto eliminando la versione?
|
codadilupo wrote: |
puo' andare ?
|
Nel tuo caso, temo funzioni solo con numeri di versione standard. Ma non so se tutti i numeri di versione sono numerici.
Io ci ho provato ma in Python sfruttando il path dell'ebuild tramite equery.
La cosa buona è che gli serve solo Python (ed in gentoo non puoi NON averlo ) ed equery (contenuto in gentoolkit).
L'utilizzo è semplice: ./finder.py $PACCHETTO $ROOT
dove $PACCHETTO è il nome del pacchetto...Con o senza versione è indifferente, l'importante è che sia in una sintassi accettata da equery. (anche perchè l'ho scritto in 10 minuti mentre seguivo una lezione all'Uni , quindi non c'è error checking).
$ROOT invece deve essere la root reale di portage (cioè senza link simbolici). Per default è /usr/portage, ma non è così in generale (come per me ) specie in caso di overlays.
Finalmente, ecco il codice. Spero funzioni....
Code: |
#!/usr/bin/env python
import os
import sys
#SET THERE THE PORTAGE ROOT OR OVERRIDE WITH THE SECOND CMD LINE ARGUMENT. END WITH A /
PORTAGE_ROOT=u'/usr/portage/'
#CHECK PASSED ARGUMENTS
if len(sys.argv) == 1:
print u'Usage: %s cat/pkg-ver' % sys.argv[0]
sys.exit(0)
#IF THE ROOT IS OVERRIDDEN
if len(sys.argv) == 3:
PORTAGE_ROOT = sys.argv[2]
#ADD A / IF NEEDED
if PORTAGE_ROOT[-1] != u'/':
PORTAGE_ROOT += u'/'
#GET THE FULL EBUILD
fobj = None
if sys.argv[1][0] not in (u'=', u'>', u'<'):
fobj = os.popen(u'equery which =%s' % sys.argv[1])
else:
fobj = os.popen(u'equery which \\%s' % sys.argv[1])
ebuild = fobj.read()
fobj.close()
#GET CAT AND NAME
ebuild = ebuild.replace(PORTAGE_ROOT, u'')
#final[0] WILL BE THE CATEGORY, final[1] THE NAME
final = ebuild.split(u'/')[0:2]
#SIMPLY PRINT
print u'%s/%s' % (final[0], final[1])
|
Cazzantonio wrote: |
Se uno di voi risolve questo problema gli offro una birra appena passa dalle mie parti
|
CI CONTO! _________________ Greetings by the Shogun! - Home page
1-"Prima di dare consigli agli altri, sperimentateli su voi stessi..."
2-"In medio stat virtus!" |
|
Back to top |
|
|
Cazzantonio Bodhisattva
Joined: 20 Mar 2004 Posts: 4514 Location: Somewere around the world
|
Posted: Fri Jun 23, 2006 2:19 pm Post subject: |
|
|
ecco la mia soluzione barbara non funzionava (ovviamente) con nomi tipo app-misc/ca-certificates-20050804 che hano il numero di versione completamente alfanumerico senza punti
ora leggo i vostri due post... aspe un attimo
[EDIT1]
@coda
la tua soluzione funziona anche con pacchetti tipo app-misc/ca-certificates-20050804 che piantano il mio ciclo while...
Siccome non conosco esattamente sed (sed è un macello da imparare ) non capisco perché non dovrebbe funzionare con caratteri particolari...
[/EDIT1]
[EDIT2]
@shogun_panda
Anche il tuo script in python funziona... dici che è più generale rispetto alla riga di sed di coda?
Devo offrire una birra ad entrambi?
Comunque tutto questo nasce dal fatto che equery depends talvolta (spesso) non da un risultato utile se invocato come equery depends <cat>/<pkg>-<ver> ma solo come equery depends <cat>/<pkg> (penso sia un bug )
[/EDIT2] _________________ Any mans death diminishes me, because I am involved in Mankinde; and therefore never send to know for whom the bell tolls; It tolls for thee.
-John Donne |
|
Back to top |
|
|
Kernel78 Moderator
Joined: 24 Jun 2005 Posts: 3654
|
Posted: Fri Jun 23, 2006 2:36 pm Post subject: |
|
|
se uno ha eix installato può anche fare così
Code: | eix -e qt | grep -E '^\*' | cut -f 2 -d " " |
_________________ Le tre grandi virtù di un programmatore: pigrizia, impazienza e arroganza. (Larry Wall).
Prima di postare un file togli i commenti con Code: | grep -vE '(^[[:space:]]*($|(#|!|;|//)))' |
|
|
Back to top |
|
|
Cazzantonio Bodhisattva
Joined: 20 Mar 2004 Posts: 4514 Location: Somewere around the world
|
Posted: Fri Jun 23, 2006 2:44 pm Post subject: |
|
|
Kernel78 wrote: | se uno ha eix installato può anche fare così
Code: | eix -e qt | grep -E '^\*' | cut -f 2 -d " " |
|
no perché eix non accetta come input il numero della versione...
solo dall'ultima relase mi pare accetti <cat>/<pkg>... prima accettava solo <pkg> come input
se fai una ricerca Code: | eix -e qt-4.1.2 | grep -E '^\*' | cut -f 2 -d " " | lo vedi subito
Comunque grazie per aver partecipato al concorso "Passa da Firenze e vinci una birra"
[EDIT] ho fatto prove con tutti i pacchetti da me installati e le soluzioni di coda e di panda funzionano bene entrambe
Siccome però a parità di risultato quella di coda è estremamente più elegante (solo una riga di codice ) direi che merita una birra grande mentre a panda ne offrirò una piccola per il secondo posto _________________ Any mans death diminishes me, because I am involved in Mankinde; and therefore never send to know for whom the bell tolls; It tolls for thee.
-John Donne |
|
Back to top |
|
|
Kernel78 Moderator
Joined: 24 Jun 2005 Posts: 3654
|
Posted: Fri Jun 23, 2006 3:01 pm Post subject: |
|
|
scusate tutti ma sono troppo rimbambito, sto facendo una settimana di straordinari e mi tocca lavorare anche domattina o mi obbligano a rimandare le ferie , insomma sono stressato e non avevo capito un cavolo della tua richiesta _________________ Le tre grandi virtù di un programmatore: pigrizia, impazienza e arroganza. (Larry Wall).
Prima di postare un file togli i commenti con Code: | grep -vE '(^[[:space:]]*($|(#|!|;|//)))' |
|
|
Back to top |
|
|
shogun_panda Guru
Joined: 30 Jul 2004 Posts: 411 Location: Campobasso or Rome, Molise or Lazio, Italy, Europe, Earth, Solar system, Milk Way, Universe
|
Posted: Fri Jun 23, 2006 3:18 pm Post subject: |
|
|
Cazzantonio wrote: |
Comunque grazie per aver partecipato al concorso "Passa da Firenze e vinci una birra"
|
Cazzantonio wrote: |
[EDIT] ho fatto prove con tutti i pacchetti da me installati e le soluzioni di coda e di panda funzionano bene entrambe
Siccome però a parità di risultato quella di coda è estremamente più elegante (solo una riga di codice )
|
Ca**o ho perso!
Vabbè...col grande coda me lo posso pure permettere...
Cmq avevo pensato anche io alla soluzione di coda...Il problema è che ci sono alcuni pacchetti con cui non funziona. Sono quelli che usano le lettere anche per il numero di versione...SO che ci sono, ma non saprei dirvi quali...
Cazzantonio wrote: |
direi che merita una birra grande mentre a panda ne offrirò una piccola per il secondo posto
|
Vabbè...CONTINUO A CONTARCI!
A parte questo, volendo si può anche evitare l'uso di cut:
Code: |
echo "gnome-extra/gnome-power-manager-2.14.2" | sed -e 's/(.+)(-[0-9](.+))/\1/'
|
Però dovreste testarlo...Ora sto sotto Windows...
Ciao ciao! _________________ Greetings by the Shogun! - Home page
1-"Prima di dare consigli agli altri, sperimentateli su voi stessi..."
2-"In medio stat virtus!" |
|
Back to top |
|
|
salade Apprentice
Joined: 10 May 2004 Posts: 170
|
Posted: Fri Jun 23, 2006 4:16 pm Post subject: |
|
|
shogun_panda wrote: |
Cmq avevo pensato anche io alla soluzione di coda...Il problema è che ci sono alcuni pacchetti con cui non funziona. Sono quelli che usano le lettere anche per il numero di versione...SO che ci sono, ma non saprei dirvi quali...
|
Code: |
pc30384 ~ # echo "media-video/mplayer-1.0_pre8"| sed -e 's/-[0-9]/*/g' | cut -d"*" -f1
media-video/mplayer
pc30384 ~ #
|
era questo che intendevi? |
|
Back to top |
|
|
ProT-0-TypE Veteran
Joined: 20 Dec 2003 Posts: 1624 Location: Cagliari
|
Posted: Fri Jun 23, 2006 4:43 pm Post subject: |
|
|
un tempo ci avevo provato anche io.. ma c'è sempre qualche problema con pacchetti tipo questo:
Code: | echo "media-fonts/font-bitstream-100dpi-1.0.0" | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1
media-fonts/font-bitstream |
_________________ [Vuoi guadagnare navigando?] |
|
Back to top |
|
|
Cazzantonio Bodhisattva
Joined: 20 Mar 2004 Posts: 4514 Location: Somewere around the world
|
Posted: Fri Jun 23, 2006 8:10 pm Post subject: |
|
|
ProT-0-TypE wrote: | un tempo ci avevo provato anche io.. ma c'è sempre qualche problema con pacchetti tipo questo:
Code: | echo "media-fonts/font-bitstream-100dpi-1.0.0" | sed -e 's/-[0-9]/*/g' | cut -d"*" -f1
media-fonts/font-bitstream |
|
ecco c'era il trucco...
Posizioni invertite... coda birra piccola e shogun_panda birra grande!
P.S. ve la offro davvero se passare da firenze... potete contarci! _________________ Any mans death diminishes me, because I am involved in Mankinde; and therefore never send to know for whom the bell tolls; It tolls for thee.
-John Donne |
|
Back to top |
|
|
zolar czakl Apprentice
Joined: 25 Sep 2004 Posts: 162 Location: UMRK
|
Posted: Sat Jun 24, 2006 12:36 am Post subject: |
|
|
A parte problemi di permessi Code: | /usr/lib/portage/bin/pkgname media-fonts/font-bitstream-100dpi-1.0.0 | cut -d" " -f1
media-fonts/font-bitstream-100dpi |
Oppure con una piccola modifica al programma (non l'originale mi raccomando ) si puo' eliminare il cut
Code: | #!/usr/bin/python
# Copyright 1999-2006 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Id: /var/cvsroot/gentoo-src/portage/bin/pkgname,v 1.8 2004/10/04 13:56:50 vapier Exp $
import sys
sys.path = ["/usr/lib/portage/pym"]+sys.path
import portage
a=portage.pkgsplit(sys.argv[1])
if a:
print a[0]
sys.exit(0)
else:
print '!!! Error: package name is invalid.'
sys.exit(1) |
|
|
Back to top |
|
|
codadilupo Advocate
Joined: 05 Aug 2003 Posts: 3135
|
Posted: Sat Jun 24, 2006 5:33 am Post subject: |
|
|
zolar czakl wrote: | A parte problemi di permessi Code: | /usr/lib/portage/bin/pkgname media-fonts/font-bitstream-100dpi-1.0.0 | cut -d" " -f1
media-fonts/font-bitstream-100dpi |
|
abbiamo reinventato la ruota!
Coda |
|
Back to top |
|
|
shogun_panda Guru
Joined: 30 Jul 2004 Posts: 411 Location: Campobasso or Rome, Molise or Lazio, Italy, Europe, Earth, Solar system, Milk Way, Universe
|
Posted: Sat Jun 24, 2006 8:40 am Post subject: |
|
|
Cazzantonio wrote: |
Posizioni invertite... coda birra piccola e shogun_panda birra grande!
|
Yabadabadoo! HIC!
PS: Eh eh....steng 'mbriac' prim' d' bev'!
PPS: Sono molisano, ma si dovrebbe capire, no? _________________ Greetings by the Shogun! - Home page
1-"Prima di dare consigli agli altri, sperimentateli su voi stessi..."
2-"In medio stat virtus!" |
|
Back to top |
|
|
mouser Veteran
Joined: 10 Aug 2004 Posts: 1419 Location: Milano
|
Posted: Wed Jan 24, 2007 9:28 am Post subject: [REGEXP] Estrazione dei nomi dei software in portage |
|
|
Buongiorno a tutti!!!
Sto scrivendo uno script (che presto presenterò al pubblico), che ha bisogno di estrarre i nomi da dei programmi da una lista ottenuta da emerge.
Spiego meglio: io lancio il comando (per esempio):
Code: | # emerge --pretend kdebluetooth | grep ebuild | awk '{print $4}'
kde-base/kdialog-3.5.5
kde-base/libkonq-3.5.5
kde-base/kfind-3.5.5
kde-base/kdebase-data-3.5.5
kde-base/kicker-3.5.5
kde-base/khotkeys-3.5.5
kde-base/kdesu-3.5.5
kde-base/khelpcenter-3.5.5
kde-base/kcminit-3.5.3
kde-base/kcontrol-3.5.5
dev-libs/cyrus-sasl-2.1.22-r1
dev-libs/dbus-qt3-old-0.70
kde-base/kdebase-kioslaves-3.5.5-r1
kde-base/konqueror-3.5.5
net-wireless/kdebluetooth-1.0_beta1-r2 |
Attualmente passo ogni voce di questa lista ad una regexp che cerca di estrarre il nome del pacchetto; per esempio da "net-wireless/kdebluetooth-1.0_beta1-r2" estrae "net-wireless/kdebluetooth".
Per quello che sono riuscito a fare finora (chiedo scusa anticipatamente ai puristi del sed/awk per le castronerie che avrò fatto ) sono arrivato a questa soluzione:
Code: | # echo kde-base/kdebase-data-3.5.5 | sed -r s/'-([0-9]|\.)*(-r[0-9]+.*)*$'//g | sed -r s/'-([0-9]|\.)*(_p|_pre[0-9]+)*$'//g
kde-base/kdebase-data
# echo kde-base/kicker-3.5.5 | sed -r s/'-([0-9]|\.)*(-r[0-9]+.*)*$'//g | sed -r s/'-([0-9]|\.)*(_p|_pre[0-9]+)*$'//g
kde-base/kicker
# echo net-print/foomatic-db-ppds-20060720 | sed -r s/'-([0-9]|\.)*(-r[0-9]+.*)*$'//g | sed -r s/'-([0-9]|\.)*(_p|_pre[0-9]+)*$'//g
net-print/foomatic-db-ppds |
che funziona con la maggior parte dei nomi dei pacchetti.
Il problema nasce quando incontro nomi di pacchetti non standard, quali net-wireless/kdebluetooth-1.0_beta1-r2
Code: | # echo net-wireless/kdebluetooth-1.0_beta1-r2 | sed -r s/'-([0-9]|\.)*(-r[0-9]+.*)*$'//g | sed -r s/'-([0-9]|\.)*(_p|_pre[0-9]+)*$'//g
net-wireless/kdebluetooth-1.0_beta1-r2
# |
Visto che sono ormai 2 settimane che ci sbatto la testa, non è che qualcuno ha già una regexp che funzione per "tutto" o quasi il portage??
Mi andrebbero bene anche soluzioni alternative, magari usando tool esterni.
Grazie mille
Ciriciao
mouser |
|
Back to top |
|
|
gioi Apprentice
Joined: 14 Feb 2006 Posts: 236
|
Posted: Wed Jan 24, 2007 10:25 am Post subject: |
|
|
Il ragionamento che faccio è:
- voglio che la regexp elimini la "versione".
- la versione inizia sempre con "-" seguito da un numero seguito da un punto seguito da altra roba...
per cui la regexp che userei io è:
per esempio, ammesso di aver creato un file chiamato lista.txt che contenga i pacchetti con la versione come da tuo esempio io farei:
Code: | cat lista.txt | perl -p -e 's/\-\d+\..+//' |
ed eccoti la lista filtrata...
Naturalmente potresti estenderla per eliminare l'output che non ti interessa di emerge -p direttamente con un comando solo...
Ora sono a lavoro e non ho gentoo, quindi non mi ricordo la formattazione precisa, ma stasera quando sono a casa ti do la regexp estesa precisa...
ciao!
PS: io non uso sed e awk causa idiosincrasia da esaurimento nervoso post altrui script-debugging! |
|
Back to top |
|
|
mouser Veteran
Joined: 10 Aug 2004 Posts: 1419 Location: Milano
|
Posted: Wed Jan 24, 2007 10:35 am Post subject: |
|
|
Prima di tutto.... grazie!
Proverò questa soluzione, anche se preferirei non avere anche perl come dipendenza dello script.... quindi, se qualcuno conosce altre soluzioni od il corrispettivo sed/awk si faccia avanti (comunque farò delle prove per portarmi la sintassi anche li.... non credo di avere grossi problemi)
Ciriciao
mouser
edit:
Ho appena provato e...... funziona!!!! ora farò un bel pò di prove per vedere se gira con tutto.... nel caso, il perl secondo voi è accettabile come dipendenza? |
|
Back to top |
|
|
gioi Apprentice
Joined: 14 Feb 2006 Posts: 236
|
Posted: Wed Jan 24, 2007 10:50 am Post subject: |
|
|
mouser wrote: | Prima di tutto.... grazie!
Proverò questa soluzione, anche se preferirei non avere anche perl come dipendenza dello script.... quindi, se qualcuno conosce altre soluzioni od il corrispettivo sed/awk si faccia avanti (comunque farò delle prove per portarmi la sintassi anche li.... non credo di avere grossi problemi)
Ciriciao
mouser
edit:
Ho appena provato e...... funziona!!!! ora farò un bel pò di prove per vedere se gira con tutto.... nel caso, il perl secondo voi è accettabile come dipendenza? |
Ma guarda che se non ricordo male la regexp di cui sopra la puoi usare anche con sed... |
|
Back to top |
|
|
ProT-0-TypE Veteran
Joined: 20 Dec 2003 Posts: 1624 Location: Cagliari
|
Posted: Wed Jan 24, 2007 10:54 am Post subject: |
|
|
non c'è bisogno di scomodare le regexp, da qualche parte c'è un eseguibile (che penso faccia parte del package di portage) che fa questo per te. Non sono a casa e non mi ricordo esattamente dove sta, ma se fai un search nel forum dovresti trovare un post dove se ne parla. _________________ [Vuoi guadagnare navigando?] |
|
Back to top |
|
|
makoomba Bodhisattva
Joined: 03 Jun 2004 Posts: 1856
|
Posted: Wed Jan 24, 2007 11:03 am Post subject: |
|
|
Code: | sed -e 's|\-[[:digit:]].*$||' |
_________________ When all else fails, read the instructions. |
|
Back to top |
|
|
ProT-0-TypE Veteran
Joined: 20 Dec 2003 Posts: 1624 Location: Cagliari
|
Posted: Wed Jan 24, 2007 11:03 am Post subject: |
|
|
Trovato!
Code: | /usr/lib/portage/bin/pkgname |
Se n'era parlato qua _________________ [Vuoi guadagnare navigando?] |
|
Back to top |
|
|
gioi Apprentice
Joined: 14 Feb 2006 Posts: 236
|
Posted: Wed Jan 24, 2007 11:08 am Post subject: |
|
|
makoomba wrote: | Code: | sed -e 's|\-[[:digit:]].*$||' |
|
mmm... in effetti l'utilizzo del "$" per specificare di applicare il filtro solo alla fine della stringa sarebbe la cosa più corretta, ma IMHO è ridondante visto che i pacchetti di solito non contengono nel nome la stringa "-N." (dove N ovviamente è un numero) se non per quanto riguarda la versione...
Non è una critica... sto solo filosofeggiando un po' |
|
Back to top |
|
|
crisandbea Veteran
Joined: 03 Jul 2005 Posts: 1778 Location: BOSCO (SA) ... ma domiciliato a Bologna....
|
Posted: Wed Jan 24, 2007 11:11 am Post subject: |
|
|
ProT-0-TypE wrote: | Trovato!
Code: | /usr/lib/portage/bin/pkgname |
Se n'era parlato qua |
non credo faccia al caso di "mouser", per lo scopo che penso raggiungere, e poi mi sembra più semplice il modo che attuo io
Code: |
emerge -pvt pacchetto | sed -e 's|\-[[:digit:]].*$||' | grep ebuild | awk '{ print $4}' |
ciauz |
|
Back to top |
|
|
ProT-0-TypE Veteran
Joined: 20 Dec 2003 Posts: 1624 Location: Cagliari
|
Posted: Wed Jan 24, 2007 11:13 am Post subject: |
|
|
makoomba wrote: | Code: | sed -e 's|\-[[:digit:]].*$||' |
|
Con pacchetti tipo questo non funziona:
Code: | echo font-bitstream-100dpi-1.0.0 | sed -e 's|\-[[:digit:]].*$||'
font-bitstream |
_________________ [Vuoi guadagnare navigando?] |
|
Back to top |
|
|
ProT-0-TypE Veteran
Joined: 20 Dec 2003 Posts: 1624 Location: Cagliari
|
Posted: Wed Jan 24, 2007 11:16 am Post subject: |
|
|
crisandbea wrote: | ProT-0-TypE wrote: | Trovato!
Code: | /usr/lib/portage/bin/pkgname |
Se n'era parlato qua |
non credo faccia al caso di "mouser", per lo scopo che penso raggiungere, e poi mi sembra più semplice il modo che attuo io
Code: |
emerge -pvt pacchetto | sed -e 's|\-[[:digit:]].*$||' | grep ebuild | awk '{ print $4}' |
ciauz |
Non mi sembra proprio più semplice... comunqe hai provato se per pacchetti tipo font-bitstream-100dpi-1.0.0 funziona? _________________ [Vuoi guadagnare navigando?] |
|
Back to top |
|
|
|