Come posso ottenere un elenco di pacchetti obsoleti?


19

Sto cercando di trovare un modo per ottenere un elenco dei pacchetti che non sono più disponibili nei repository che ho abilitato. Questa workstation è passata attraverso alcune versioni di Ubuntu e ha avuto molti repository di terze parti aggiunti e rimossi. Vorrei ottenere un elenco di software che ho da questi repository rimossi, così posso ripulirlo o aggiungere nuovamente i repository appropriati.

Risposte:


23
aptitude search '~o'

Aptitude ha a disposizione alcune ricerche molto potenti. Sfortunatamente la sintassi è un po 'ingombrante e devi scavare oltre la manpage per trovare la documentazione, ma ne vale la pena.

Le versioni apt-show possono anche essere utili:

apt-show-versions | grep 'No available version'

1
leggi un bell'articolo sui pacchetti obsoleti qui: raphaelhertzog.com/2011/02/07/…
Lluís

Un altro utile elenco è generato daapt-show-versions | grep "newer than version in archive"
Sean il

Penso che le versioni di apt-show siano le migliori semplicemente perché la linea di aptitude è estremamente controintuitiva da ricordare. Ogni volta che ne ho bisogno, devo cercarlo su Google / cercarlo / salvarlo / creare uno script / ecc.
j riv

6

Per ottenere un elenco di app che non si trovano in un repository registrato o in PPA, procedere come segue:

sudo apt-get install apt-show-versions
apt-show-versions | grep 'No available version'

Questo dovrebbe generare un testo come questo:

app1 1.0.0.14 installed: No available version in archive
app23 0.3.6 installed: No available version in archive
app332 7.0.9377 installed: No available version in archive

Per me questo ha funzionato e ha mostrato tre app che ho installato usando pacchetti DEB e non erano disponibili in Repo o PPA.

Ricorda però che è impossibile controllare tutti i programmi, solo quelli che sono passati dpkg. Ad esempio, alcune app vengono installate semplicemente estraendole nelle cartelle corrette oppure altre utilizzano un bin o uno script di installazione autonomo. Quindi il modo migliore per te è mantenere un elenco di app installate tramite qualsiasi metodo diverso da APT.


Funziona con tutti i miei dpkgpacchetti installati locali . Un'eccezione Elenca skype-bin, mentre apt-cache policy skype-binmostra chiaramente il repository dei partner canonici. Non sono sicuro di cosa stia succedendo. Problema multiarch? Ancora +1 per apt-show-versions!
gertvdijk,

aptitude chiama questi pacchetti "obsoleti". Vedi il commento sulla cronite sopra.
Henk Poley,

5

Se hai installato aptitude ,

aptitude search '?obsolete'

o la sua forma abbreviata

aptitude search '~o'

Ecco un esempio di output

i A gcc-4.7-base - GCC, the GNU Compiler Collection (base package)
id  libdb4.7     - Berkeley v4.7 Database Libraries [runtime]
i   libudev0     - libudev shared library

Il primo carattere di ogni riga indica lo stato corrente del pacchetto. Gli stati più comuni sono:

  • p, nel senso che non esiste alcuna traccia del pacchetto sul sistema,
  • c, il che significa che il pacchetto è stato eliminato ma i suoi file di configurazione rimangono sul sistema,
  • i, il che significa che il pacchetto è installato e
  • v, il che significa che il pacchetto è virtuale.

Il secondo carattere indica l'azione memorizzata da eseguire sul pacchetto, se presente, altrimenti viene visualizzato uno spazio vuoto. Le azioni più comuni sono:

  • i, nel senso che il pacchetto verrà installato,
  • d, il che significa che il pacchetto verrà eliminato e
  • p, il che significa che il pacchetto e i suoi file di configurazione verranno rimossi.

Se il terzo carattere è A, il pacchetto è stato installato automaticamente.

Per un elenco completo dei possibili flag di stato e di azione, consultare la sezione Accesso alle informazioni sul pacchetto nella guida di riferimento di aptitude.


1
aptitude search ?obsoletepotrebbe funzionare in bash, ma dovresti usareaptitude search '?obsolete'
AB

potresti aggiungere qualche dettaglio sull'analisi dell'output?
Elder Geek,

"? Obsoleto" è diverso da "~ o"?
Sean,

@Sean No, non sono diversi. ~ o è davvero la forma abbreviata di? obsoleto.
Demis Palma ツ

Le virgolette vengono analizzate dalla shell. Penso che AB significhi che non dovresti passare strani personaggi senza caratteri di escape sulla riga di comando perché non sai che cosa farà la tua shell con loro.
Sean,

2

A partire da Ubuntu 19.10 è anche possibile eseguire

apt list ?obsolete

per ottenere l'elenco dei pacchetti obsoleti.

Per qualsiasi versione è possibile utilizzare il seguente one-liner Bash:

comm -23 <(dpkg-query -W -f '${db:Status-Abbrev}\t${Package}\n' | grep '^.[^nc]' | cut -f2 | sort) <(apt-cache dumpavail | sed -rn 's/^Package: (.*)/\1/p' | sort -u)

Non è necessario installare pacchetti aggiuntivi per questo, inoltre è relativamente veloce. Questo troverà anche pacchetti parzialmente installati (ma non troverà quelli che hanno solo file di configurazione rimanenti; che potrebbero essere cambiati facilmente, comunque). Nota: questo non importa di quale architettura siano i pacchetti.

Se si desidera includere pacchetti con una versione installata diversa da quella disponibile dai repository, è possibile scegliere una delle seguenti opzioni:

Usa apt moderno:

 apt list --installed | awk -F/ '/\[installed,local\]/{print $1}'

Ancora un'altra opzione è eseguire

ubuntu-support-status --show-unsupported

e leggi i nomi dei pacchetti nella sezione "Non più scaricabile:".


'elenco apt - installato manualmente | grep -v cosmic 'mostra falsi positivi. Questa risposta è molto meglio!
TamusJRoyce,

1
@TamusJRoyce, sì, suppongo che ora dopo la modifica.
jarno,

1

Maggiori informazioni per indagare.

ubuntu-support-status 
echo "$ (pacchetti sudo apt-mark showmanual | wc -l) contrassegnati come 'installati manualmente'."

... ubuntu-support-status e apt-mark potrebbero richiedere l'installazione.


Non c'è bisogno di usare sudocon apt-mark showmanual.
jarno,

ubuntu-support-statuselenca il numero di pacchetti obsoleti, ma non i nomi dei pacchetti.
jarno,

1
Leggi l'output diubuntu-support-status --help
Hannu il

Oh, grazie per il suggerimento.
jarno,

0

Potrebbe esserci un modo più pulito, ma puoi farlo dalla parte superiore della mia testa

dpkg -l | cut -f 3 -d ' ' > installed
xargs -n 1 --replace=X apt-cache search ^X$ < installed | cut -f 1 -d ' ' > available
diff installed available

Pulisci le prime righe del installedfile: avrà intestazioni.

Bonus se qualcuno può correggere l'evidenziazione della mia sintassi ...


2
se si intende utilizzare l'output di dpkg -lper ottenere un elenco di pacchetti installati, è necessario limitare i risultati alle righe con 'i' nella seconda colonna, poiché dpkg elencherà anche i pacchetti che non sono installati (forse rimossi ma non eliminati) . ad esempio, la modifica del primo comando in modo da dpkg -l | grep '^.[^i]' | cut -f 3 -d ' ' restituirebbe un elenco di pacchetti NON installati. (ma una volta lo erano)
stufate il

1
inoltre, apt-cache search someinstalledpackagerestituirà qualcosa anche se il pacchetto non è disponibile da un repository, quindi non credo che funzionerà affatto.
Spezzatino il

1
@stew Lascio qui per vedere se qualcuno raggiunge delle conclusioni, ma la tua risposta è decisamente migliore. +1 a te.
Jeff Ferland,

@stew dpkg -l | grep '^.[^i]' | cut -f 3 -d ' 'stampa anche alcune righe di intestazione.
jarno,

Anche se questa risposta funzionasse, sarebbe molto lenta in quanto verrebbe eseguita apt-cache searchseparatamente per ciascun pacchetto.
jarno,

0

Come accennato apt-get search non è un buon metodo per verificare se un pacchetto è ancora disponibile. Inoltre ho aggiunto tutto a una sola riga:

for i in `dpkg -l | grep '^i' | awk '{ print $2 }'`; do apt-cache show $i > /dev/null || echo $i; done

E perchégrep '^i'
AB,

@AB buon punto; ciò non indica se il pacchetto è installato, ma che l'azione desiderata del pacchetto deve essere installata. Vedi man dpkg-queryper maggiori informazioni.
jarno,

Questo è molto lento
jarno

apt-cache shownon è utile per verificare se il pacchetto è disponibile. Se si disabilita il rispettivo repository e nessun altro repository abilitato lo possiede, mostra comunque il pacchetto.
jarno,
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.