Elencare i pacchetti installati in modo esplicito


53

In Gentoo c'è il file /var/lib/portage/worldche contiene i pacchetti che ho installato esplicitamente. Con esplicito intendo, i pacchetti che scelgo, esclusi quelli installati per impostazione predefinita o estratti dalle dipendenze.

Esiste un file simile o un comando per trovare tali informazioni in Ubuntu?

Risposte:


46

Solo il codice

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest \
  | cut -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt

Spiegazione

Un modo di pensare a questo problema è dividerlo in tre parti:

  • Come posso ottenere un elenco di pacchetti non installati come dipendenze?
  • Come posso ottenere un elenco dei pacchetti installati per impostazione predefinita?
  • Come posso ottenere la differenza tra questi due elenchi?

Come posso ottenere un elenco di pacchetti non installati come dipendenze?

Il seguente comando sembra funzionare sul mio sistema:

$ aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt

Approcci simili possono essere trovati nei link che Gilles ha pubblicato come commento alla domanda. Alcune fonti affermano che questo funzionerà solo se hai usato aptitude per installare i pacchetti; tuttavia, non uso quasi mai aptitude per installare i pacchetti e ho scoperto che funzionava ancora. Questo --disable-columnsimpedisce a aptitude di riempire le righe di nomi di pacchetti con spazi vuoti che ostacolerebbero il confronto di seguito. Il | sort -usmista i duplicati di file e rimuove. Questo rende il passaggio finale molto più semplice.

Come posso ottenere un elenco dei pacchetti installati per impostazione predefinita?

Nota: questa sezione inizia con un "percorso sbagliato" che penso sia illustrativo. Il secondo pezzo di codice è quello che funziona.

Questo è un po 'più complicato. Inizialmente ho pensato che una buona approssimazione sarebbero stati tutti i pacchetti che sono dipendenze dei meta-pacchetti ubuntu-minimal, ubuntu-standard, ubuntu-desktop e dei vari pacchetti correlati al kernel linux. Alcuni risultati sulle ricerche su Google sembravano utilizzare questo approccio. Per ottenere un elenco di queste dipendenze, ho prima provato quanto segue (che non ha funzionato):

$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u

Questo sembra tralasciare alcuni pacchetti che, a mio avviso, dovevano venire di default. Credo ancora che questo metodo dovrebbe funzionare se si costruisce il giusto elenco di metapacchetti.

Tuttavia, sembra che i mirror di Ubuntu contengano un file "manifest" che contiene tutti i pacchetti nell'installazione predefinita. Il manifest per Ubuntu 12.04.3 è qui:

http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest

Se cerchi in questa pagina (o nella pagina di un mirror più vicino a te):

http://mirror.pnl.gov/releases/precise/

Dovresti essere in grado di trovare il file ".manifest" che corrisponde alla versione e all'architettura che stai utilizzando. Per estrarre solo i nomi dei pacchetti ho fatto questo:

wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f1 | sort -u > defaultinstalled.txt

L'elenco era probabilmente già ordinato e unico, ma volevo essere sicuro che fosse correttamente ordinato per facilitare il passaggio successivo. Ho quindi inserito l'output defaultinstalled.txt.

Come posso ottenere la differenza tra questi due elenchi?

Questa è la parte più semplice poiché la maggior parte dei sistemi simili a Unix ha molti strumenti per farlo. Lo commstrumento è uno dei molti modi per farlo:

comm -23 currentlyinstalled.txt defaultinstalled.txt

Questo dovrebbe stampare l'elenco delle righe che sono uniche per il primo file. Pertanto, dovrebbe stampare un elenco di pacchetti installati non presenti nell'installazione predefinita.


Cosa non fa la tua prima pipeline aptitude search '~i!~M' -F %p?
effimero

@ephemient: probabilmente niente. Non so molto di attitudine e quindi degli strumenti usati con cui ho familiarità piuttosto che scavare nel file man di un programma che non uso mai.
Steven D,

1
In qualche modo distruggi la mia speranza, ho pensato che ci fosse un modo semplice standard :(
phunehehe

3
Funziona quasi, ma non è ancora corretto. Esistono più pacchetti e librerie che certamente non ho installato manualmente nell'elenco risultante. Ho usato http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifeste l'aggiunta | sed "s/ *$//"ma ancora nessun dado.
jmiserez,

1
Il primo passaggio che ottiene un elenco di pacchetti non installati come dipendenze può essere sostituito con apt-mark showmanual | sort -u, come mostrato in altre risposte. Più semplice e non si basa su aptitudequale non è installato per impostazione predefinita.
skagedal,

24

È possibile utilizzare una di queste due linee singole. Entrambi producono lo stesso identico output sulla mia macchina e sono più precisi di tutte le soluzioni finora proposte (luglio 2014) in questa domanda. Sono una combinazione delle due risposte (1) e (2) . Nota che inizialmente ho pubblicato questa risposta qui .

Utilizzando apt-mark:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Utilizzando aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Pochissimi pacchetti cadono ancora nelle fessure, anche se sospetto che questi siano effettivamente installati dall'utente, subito dopo l'installazione tramite l'installazione della localizzazione della lingua o, ad esempio, tramite il programma di installazione del codec Totem. Inoltre, anche le versioni di intestazione linux sembrano accumularsi, anche se ho installato solo il metapacchetto non specifico della versione. Esempi:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Come funziona

  1. Ottieni l'elenco dei pacchetti installati manualmente. Per attitudine, lo sedspazio aggiuntivo rimuove gli spazi bianchi rimanenti alla fine della linea.
  2. Ottieni l'elenco dei pacchetti installati subito dopo una nuova installazione.
  3. Confronta i file, genera solo le righe nel file 1 che non sono presenti nel file 2.

Anche altre possibilità non funzionano:

  • Utilizzo del ubuntu-14.04-desktop-amd64.manifestfile ( qui per Ubuntu 14.04) anziché /var/log/installer/initial-status.gz. Più pacchetti vengono mostrati come installati manualmente anche se non lo sono.
  • Usando apt-mark showautoinvece di /var/log/installer/initial-status.gz. apt-markper esempio non include il pacchetto xserver-xorg, mentre l'altro file lo fa.

Entrambi elencano più pacchetti rispetto alla soluzione sopra.


Se hai aggiornato il tuo sistema dalla tua installazione iniziale (che è il caso per la maggior parte delle persone penso), è meglio usare il file manifest della tua attuale versione di Ubuntu.
Diego V,

Se hai aggiornato, penso che dovresti usare entrambi i file, non solo il file manifest. Puoi farlo facilmente semplicemente aggiungendo un altro confronto. Il file manifest purtroppo non contiene tutto ciò che il file initial_status.gz contiene (ho controllato).
jmiserez,

Sono impressionato! Ho trovato un pezzo mancante comunque. Che dire dei pacchetti che sono stati inizialmente installati ma che sono stati poi rimossi esplicitamente manualmente , ma successivamente reinstallati in modo esplicito manualmente ? L'ho trovato in un sistema funzionante.
n611x007,

1
Ho fatto una domanda unix.SE/225330: Elenca i pacchetti rimossi in modo esplicito (apt) per affrontare la maggior parte del lavoro.
n611x007,

1
Questo è meglio della soluzione accettata, poiché l' URL mirror.pnl.gov/releases/precise/… nella soluzione accettata ora è un 404.
rmunn,

9

Secondo man apt-mark:

apt-mark showauto
apt-mark showmanual

2
showmanualsta mostrando cose del genere xserver-xorg-video-vesa, che giuro non ho installato manualmente.
phunehehe,

probabilmente installato automaticamente dalla tua distribuzione alla prima installazione.
Matt,

8

Ecco alcuni esempi di output di cat /var/log/apt/history.log:

Start-Date: 2011-01-22  00:43:38
Commandline: apt-get --target-release experimental install libdbus-1-dev
Upgrade: libdbus-1-3:i386 (1.4.0-1, 1.4.1-1), libdbus-1-dev:i386 (1.4.0-1, 1.4.1-1)
End-Date: 2011-01-22  00:43:48

Start-Date: 2011-01-23  01:16:13
Commandline: apt-get --auto-remove purge webcheck
Purge: python-utidylib:i386 (0.2-6), python-beautifulsoup:i386 (3.1.0.1-2), libtidy-0.99-0:i386 (20091223cvs-1), webcheck:i386 (1.10.3)
End-Date: 2011-01-23  01:16:31

Per quanto riguarda la tua domanda, filtra le cose con grep ( cat /var/log/apt/history.log | grep Commandline).

Nota che questi file sono ruotati, quindi controlla gli altri in modo da non perdere nulla:

$ ls /var/log/apt/history.log*
-rw-r--r-- 1 root root 69120 2011-01-23 18:58 /var/log/apt/history.log
-rw-r--r-- 1 root root 19594 2011-01-01 02:48 /var/log/apt/history.log.1.gz

NOTA :

  • Ho controllato sia aptitude che synaptic (rispettivamente versioni 0.70 e 0.6.3 ) ed entrambi registrano le loro attività su quel file di log. L'unico inconveniente con loro è che non hanno la linea che inizia Commandline, quindi il greptrucco non funzionerà con loro.

2
Soluzione interessante. Dovrai modificare un po 'il comando grep per ottenere un elenco di pacchetti e tenere conto dei pacchetti installati da aptitudee altri gestori di pacchetti. Se i tuoi registri sono stati ruotati, allora sei sfortunato.
Steven D,

@steven Aggiornato. Il mio grep-fu è un principiante, quindi lo lascerò al lettore. Inoltre, non so se la cosa ruota lontano. Devo solo archiviare da solo.
Tshepang,

La loro rotazione dipenderà dalla configurazione del logrotate e dalla durata del sistema. Non sono sicuro delle impostazioni predefinite di Ubuntu poiché è passato molto tempo da quando le ho cambiate.
Steven D,

7

Mi sono imbattuto in questo bellissimo oneliner mentre cercavo questa domanda

L'unica linea è

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )`

Questo oneliner filtra i pacchetti installati dal sistema utilizzando i log di /var/log/installer/initial-status.gz

Pubblicherò il link alla discussione originale quando l'ho trovata, poiché questo oneliner non è mio e non riesco a ricordare dove l'ho visto.


3

Vorresti dare un'occhiata a questo articolo .

Alla fine dell'articolo, c'è uno script Python che dovrebbe fare quello che vuoi.

È stato scritto per (k) Ubuntu . ma dovrebbe funzionare anche per Ubuntu .


3
il collegamento non sembra più funzionare.
sabato

2
Collegamenti interrotti come questi sono i motivi per cui è importante includere le informazioni pertinenti nella risposta.
whitehat101

2

Di seguito è un'aggiunta alla Steven D's risposta .

La seguente riga sembra troncare i nomi dei pacchetti a 32 caratteri:

aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt

Questo sembra funzionare:

aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt

vedi questa risposta


1

Check-out /var/log/apt/term.log


2
è un modo piuttosto doloroso di fare le cose, e non c'è distinzione tra i pacchetti che installo me stesso e quelli tirati dentro dalle dipendenze
phunehehe

Sono d'accordo, ma non sapevo che apt tiene traccia di quelli: / Ora lo so, grazie a Stefan :)
Joril,

1

Puoi anche guardare il file /var/lib/apt/extended_states.

cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'

Questo è utile se vuoi sapere cosa è stato installato su una vecchia partizione.


0

Un grande ringraziamento e congratulazioni a coloro che hanno ideato quel gioiello di una sceneggiatura !!!
Volevo aggiungere il mio 2 ¢ e ho fissato la data di installazione che deduco da $ info.
Non ho padroneggiato i dettagli perché i file $ info vengono aggiornati o meno e quando, ma funziona in pratica.
Il mio script elenca gli ultimi aggiornamenti dei pacchetti non dipendenti aggiunti dopo l'installazione.
Dandogli un controllo periodico, stavo vedendo cosa avrei registrato manualmente senza un singolo errore.
Cioè, lotti di pacchetti installati per lo stesso motivo. Sfortunatamente, gli aggiornamenti rompono quell'ordine.
Dopo un aggiornamento del sistema, avevo un elenco dei miei pacchetti aggiunti che l'aggiornamento non ha aggiornato seguito da quelli che ha fatto.
! Neat Godere.

info='/var/lib/dpkg/info/'

comm -13 > /tmp/packages \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

while read n; do
  echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
    | tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*/\1/') $n
done < /tmp/packages | sort
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.