Trova i pacchetti installati da un determinato repository con aptitude


Risposte:


17

Utilizzando aptitude, al fine di cercare pacchetti installati al di fuori del ramo stabile, è possibile utilizzare:

aptitude search "?narrow(?installed,?not(?archive(stable)))"

Per vedere le versioni e i nomi dei pacchetti (e invece delle descrizioni) puoi usare il comando con l'opzione format ( -Fin breve), come segue.

aptitude search -F "%p %V %v" "?narrow(?installed,?not(?archive(stable)))"

Per altri formati, dai un'occhiata alla manpage (ecco la documentazione con le opzioni disponibili ).

Che funziona, per esempio, in Debian Se è stato installato pacchetti di compressione esterno (da matricola, per esempio, apt-get install -t sid package-name.

Puoi vedere da dove proviene un pacchetto installato apt-cache policy, l'utilizzo è il seguente:

apt-cache policy <package-name>

Ad esempio, il mio pacchetto python-numpy esegue il rendering del seguente output:

$ LANG=C apt-cache policy python-numpy
python-numpy:
  Installed: 1:1.6.2-1
  Candidate: 1:1.6.2-1.2
  Version table:
     1:1.7.0-1 0
          1 http://ftp.es.debian.org/debian/ experimental/main amd64 Packages
     1:1.6.2-1.2 0
        500 http://ftp.es.debian.org/debian/ sid/main amd64 Packages
 *** 1:1.6.2-1 0
        100 /var/lib/dpkg/status
     1:1.4.1-5 0
        990 http://ftp.es.debian.org/debian/ squeeze/main amd64 Packages
        990 http://ftp.de.debian.org/debian/ squeeze/main amd64 Packages

Ciò significa che sono una versione dietro l'attuale ramo di sid / main, quindi ho una versione di vecchio sid installata. Vedo che non ho quello stabile perché è ancora 1.4.1-5, e attualmente sono a 1.6.2-1.

Al momento dell'invio questo pacchetto era già aggiornato:)


Preferisco ?any-version(), perché ~narrow(pat1, pat2)è lo stesso di ?any-version(pat1 pat2)e supporta ?any-version(pat1 pat2 pat3)senza sembrare stupido.
Robert Siemer,

18

Dopo aver letto la pagina informativa di aptitude e una dozzina di tentativi, ho finalmente ottenuto questo:

aptitude search '?narrow(?installed,?not(?archive(testing)) ?archive(unstable))'

o equivalente) :

aptitude search '~S ~i (!~Atesting ~Aunstable)'

Cercherà i pacchetti installati da archivi instabili di qualsiasi repository. Devi filtrare i pacchetti dal tuo archivio predefinito (test nell'esempio sopra).

Se si desidera filtrare i pacchetti installati da www.debian-multimedia.org/unstable:

aptitude search '~S ~i (!~Atesting ~Aunstable ?origin("Unofficial Multimedia Packages"))

Modifica: “Archivio”, “origine” ecc. Vengono detratti dal Releasefile del repository. Sfortunatamente non tutti gli strumenti sono in grado di esaminare tutte quelle righe e per loro usano una sintassi diversa. Puoi trovare quei file come /var/lib/apt/lists/*Release. O semplicemente digita apt-cache policyper avere una panoramica. apt-cache ha cambiato il suo formato di output: le versioni successive usano lo stile apt_preferences.

  • Suite:o Archive:(vecchio nome!)
    • ricerca attitudinale: ?archive(___)oppure~A___
    • formato attitudinale: %t
    • apt_preferences: release a=___
    • Ubuntu esempi: natty-backports, trusty-security,stable
  • Origin:
    • ricerca attitudinale: ?origin(___)oppure~O___
    • formato aptitude: n / a
    • apt_preferences: release o=___
    • Esempi di Ubuntu: Canonical, Google, Inc., LP-PPA-dockbar-main,Ubuntu
  • tutte le altre linee
    • attitudine: n / a

15

Esamina il tag di origine (come o = Debian ) per ciascuno dei tuoi repository correnti:

apt-cache policy | sed -n 's/.*o=\([^,]\+\).*/\1/p' | uniq

Quindi cerca i pacchetti da (o non da) un'origine particolare:

aptitude search "?installed?origin(Debian)"
aptitude search "?installed?not(?origin(Debian))"

Questo non è adatto per un controllo di sicurezza perché si basa su ciascun repository per fornire le proprie informazioni sull'origine, ma potrebbe essere utile per la risoluzione dei problemi sull'origine dei pacchetti presenti in più repository.


2
I tuoi aptitude searchschemi non sono buoni. - Selezionano in questo modo "elenca i pacchetti in cui è installata una versione e qualsiasi altra versione esiste in Debian" o "una versione installata e almeno una versione di quel pacchetto disponibile su non Debian". - Quello che cerchiamo è "la versione installata proviene da Debian (o meno)". Questo deve essere fatto con ?narrow()o ?any-version().
Robert Siemer,

Confermato. Ho installato nemo-filerollerda linuxmint, ma esiste Debiananche in. Quindi appare nell'elenco, perché è installato ed esiste da qualche parte da Debian.
Boldewyn,

6

Per completezza: sui sistemi Ubuntu è possibile utilizzare Synaptic anche per questa attività. Nella colonna di sinistra puoi filtrare i pacchetti in base alla loro origine.


Stavo cercando di farlo e ho trovato questo post SU su Google, non riesco a credere di aver trascurato Synaptic, grazie!
David Claridge,

@RobertSiemer Potrebbe aver attirato la tua attenzione, che l'ho accettato dopo due giorni senza una risposta sufficiente e prima che una qualsiasi delle altre risposte arrivasse . L'ho accettato, perché ha risolto il mio problema. Ho anche valutato tutte le risposte successive , ma, chiedo scusa, non ho mai cambiato lo stato di accettazione. Noterai anche nelle FAQ di questo sito che non ho tratto alcun guadagno di reputazione da questa mossa, dove in effetti ho perso 2 ripetizioni per non aver accettato la risposta di qualcun altro . Quindi, per favore, fai un passo indietro in futuro prima di giudicare le decisioni di qualcuno in pubblico e ripensare alle possibili cause.
Boldewyn,

2

Ho trovato questo:

aptitude search "?origin (<repository>) ?installed"

Puoi anche trovare un elenco di termini di ricerca supportati da "ricerca attitudinale" qui .


Perché è necessario eseguirlo con sudo? Mi sembra che funzioni anche senza eseguirlo come root.
Andre Holzner,

Non ha bisogno di essere eseguito con sudo
Kurtis Nusbaum il

Come ho commentato su @ Risposta anonima, questo non ha l'effetto desiderato.
Robert Siemer,

2

Innanzitutto, trova i file appropriati per il repository di interesse in / var / lib / apt / lists. Dovrebbe essere possibile farlo a livello di codice, ma non ho avuto bisogno di farlo.

Usando google chrome come esempio, prova questo:

SEARCH_PATTERN=dl.google.com_linux_chrome  # adjust to suit your needs

for PKG in $( grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages | sed 's/^Package: //' )
do
    if dpkg -s "${PKG}" 2> /dev/null 1> /dev/null
    then
        echo ${PKG}
    fi
done

e ottengo l'output:

google-chrome-stable

dpkg -s restituisce 0 se il pacchetto è installato e diverso da zero. Per scopi di riferimento futuro, l'output di

grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages

era

Package: google-chrome-beta
Package: google-chrome-stable
Package: google-chrome-unstable

... usa aptitude?
Robert Siemer,

2
@RobertSiemer In che modo è rilevante? La domanda, assumendo una ragionevole padronanza dell'inglese, è come trovare l'origine dei pacchetti installati con aptitude . Non è necessario che la soluzione usi aptitude.
Auspex,

@Auspex, credo diversamente. - E non preoccuparti, la mia padronanza dell'inglese ha superato "ragionevole" un paio di anni fa.
Robert Siemer,

2
Apparentemente no ...
Auspex,

2
@Auspex: stai cercando di provocarmi? È vero il contrario: la domanda è chiedere una soluzione basata su aptitude, non per i pacchetti installati con aptitude.
Robert Siemer,

0

Le altre risposte sono in realtà errate, poiché il parametro to ?archive()è un'espressione regolare. Quindi ?archive(stable)abbina sia stablee unstable. Per escludere solo stabledevi ancorare il modello regex:

aptitude search -F "%p %V %v %t" '?any-version(?installed ?not(?archive("^stable$")))'

Per escludere più repository:

aptitude search -F "%p %V %v %t" '?any-version(?installed ?not(?archive("^(xenial|xenial-updates)$")))'

Si noti inoltre che alcuni pacchetti appartengono a più repository, ad es xenial-security,xenial-updates. ?archive()valuta il modello regex rispetto a ciascun repository singolarmente, quindi ?archive("^xenial-updates$")corrisponderà a tutti i pacchetti appartenenti xenial-updates, anche se appartiene anche ad altri repository.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.