Generazione di un elenco di pacchetti installati manualmente e interrogazione di singoli pacchetti


183

Mi piacerebbe avere un elenco di pacchetti installati manualmente da apto aptitudeed essere in grado di scoprire se un foobarpacchetto è stato installato manualmente o automaticamente. C'è un modo pulito per farlo dalla riga di comando?


Vedi questa risposta su unix.stackexchange.com per una soluzione che filtra i pacchetti di stock.
Dirk Bergstrom,

Possibile duplicato? - askubuntu.com/questions/365
jrg


Ottima soluzione che esclude i pacchetti installati per impostazione predefinita: elenco di Ubuntu pacchetti esplicitamente installati
pcworld

Attento ai commenti delle risposte qui. Le persone non stanno dicendo come vengono visualizzati più pacchetti, ma stanno dimenticando che ci sono pacchetti di dipendenze installati da un manuale installato.
Andre Figueiredo,

Risposte:


206

È 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 (6 luglio 2014) in questa domanda.

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.

Ho usato vari altri post StackExchange come riferimenti, tuttavia nessuno funziona così come la soluzione sopra:

Entrambi elencano più pacchetti rispetto alla soluzione sopra.

EDIT: cosa fare se hai effettuato l'aggiornamento da una versione precedente:

Se hai aggiornato Ubuntu da una versione all'altra, probabilmente dovrai adattare questo processo. In tal caso, verificherei il file manifest della versione più recente (vedere sopra) oltre al file iniziale-status.gz della versione corrente. Puoi farlo facilmente semplicemente aggiungendo un altro confronto. L'uso del solo file manifest non funzionerà, poiché il file manifest purtroppo non contiene tutto ciò che fa il file initial_status.gz (ho controllato).


7
Questo non ha funzionato per me perché /var/log/installer/initial-status.gzmanca. Inoltre voglio sapere se questo dipende manualo meno dalla marcatura degli apts ?
Anwar,

1
Purtroppo non ci sono manifest per le versioni dei server.
Antti Haapala,

Ho eseguito il showmanualcomando (sotto). E usare commper confrontare i due elenchi (ordinati). Il showmanualrisultato mi ha dato 1.840 pacchetti più unici apt-mark showmanualnon mostrati da questo metodo. NESSUN pacchetto era univoco per l'output di questo commcomando. Penso che sia più interessante registrare che per il mio PC, i pacchetti 894 sono elencati in entrambi i risultati. Non sono sicuro del perché ci sia una così grande discrepanza. Alcuni (molti?) Pacchetti sembrano essere specifici della versione. Altri come XOrg, componenti GTK e lib*cose potrebbero essere aggiornamenti. Comunque questa risposta è un ottimo inizio.
sarà il

Ho appena confrontato le tue soluzioni con apt-mark showmanual. È interessante quante differenze sono visibili. la tua lista ha 238 pacchetti mentre showmanual restituisce 1717 pacchetti. Dei 2179 pacchetti installati, ci sono solo 223 in entrambi gli elenchi, 15 sono solo nei tuoi (esempi: nodejs, lightdm) e 223 sono solo in showmanual (esempi: xserver-xorg, ubuntu-desktop). Sembra che la tua lista sia più utile, ma senza sapere da dove provengono queste differenze, non è facile decidere ... (ma sono abbastanza sicuro di aver installato manualmente nginx e lightdm ...) [mi dispiace se ho appena scritto lo stesso;)]
Daniel Alder,

64

Nelle versioni più recenti del pacchetto apt, c'è anche il comando apt-mark

apt-mark showmanual

35
Questo mostra molti più pacchetti di quelli che ho installato manualmente.
Umang,

1
@Umang Hai ragione. Direi che non è stato così quando ho scritto questa risposta. Non c'è motivo per cui il mio sistema consideri linux-image-3.11.0-*-genericecc. Come manuale
Daniel Alder,

1
@Umang forse questo ti aiuterà a askubuntu.com/questions/432743/… , ma la risposta non è accettata. Il fatto è che molti pacchetti di una nuova installazione sono già contrassegnati come manuali. Ma ci sono ancora alcune cose strane. Per rimanere con il mio esempio: linux-image-3.13.0-24-genericè manuale ma la corrente linux-image-3.13.0-27-genericè automatica. Sembra che un aggiornamento di un pacchetto di riferimento (in questo caso linux-image-generic, che ha cambiato le dipendenze), il segno manuale sia impostato automaticamente
Daniel Alder

5
@DanielAlder alcuni pacchetti di una nuova installazione devono essere contrassegnati come manuali. Se nessun pacchetto contrassegnato come manuale, è possibile eliminare l'intero sistema con apt-get autoremove. Questo non è sicuramente quello che vuoi.
Anton K,

2
Se "installato manualmente" significa "installato dall'utente dopo l'installazione iniziale del sistema operativo", questa non è una risposta corretta.
Seamus,

21

Per Ubuntu 16.04, controlla il file di registro /var/log/apt/history.log.

Per esempio:

zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz

Non è perfetto, ma è abbastanza bravo a chiarire esattamente cosa ho installato a mano. Metti un -B 1grep per vedere quando è stato installato.

Esempio di output

Commandline: apt install postgresql-9.5-plv8
Commandline: aptdaemon role='role-install-file' sender=':1.85'
Commandline: apt install task
Commandline: apt autoremove
Commandline: apt install atom
Commandline: apt upgrade
Commandline: apt-get install asciinema
Commandline: apt install iperf3
Commandline: apt upgrade
Commandline: apt-get install chromium-browser
Commandline: apt install joe cpanminus build-essential postgresql libdbd-pg-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libio-socket-ssl-perl libnet-ssleay-perl libssl-dev
Commandline: aptdaemon role='role-commit-packages' sender=':1.2314'
Commandline: apt install git
Commandline: apt install sqlite
Commandline: apt install whois
Commandline: apt install libdbd-pg-perl
Commandline: apt install perl-doc
Commandline: apt upgrade

Non sono sicuro se questo raccoglie aptitudeo no. Non sembra raccogliere installazioni dall'app desktop Ubuntu Software.


1
Di tutte le risposte nel corso degli anni, questa è l'unica che si avvicina persino al server 18.04.
Quentin Skousen,

20

apt-mark showauto | grep -iE '^foobar$' produrrà "foobar" se il pacchetto è stato installato automaticamente, nient'altro.

aptitude search '!~M ~i'elencherà i pacchetti che non sono stati installati automaticamente. È un peccato che l'attitudine non farà parte dell'installazione predefinita su Ubuntu Desktop a partire dalla 10.10.


aptitude searchmostra TUTTI i pacchetti non solo quelli installati manualmente (suppongo sia quello che voleva l'OP)
Oli

1
@Oli: esaminare i modelli di ricerca attitudinali; lo schema che sto usando lì dovrebbe fare esattamente ciò che l'OP vuole.
Li Lo,

L'ho eseguito . Mostra un intero carico di pacchetti che non sono installati.
Oli

7
Qualcosa non va con questo, sto usando aptitude search '!~M ~i'ed elenca 1043 pacchetti. Non è possibile installare manualmente molti pacchetti.
ThatGraemeGuy,

Questo sicuramente non funziona come richiesto, stampa anche pacchetti preinstallati.
Irfy

9

Il seguente script stamperà tutti i pacchetti che non sono impostati per l'installazione automatica e quindi sono stati installati manualmente:

#!/usr/bin/python

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
    pkgname = tagfile.section.get("Package")
    autoInst = tagfile.section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

si basa su come apt-mark stampa i pacchetti installati automaticamente.


Complimenti a te, signore. Questo effettivamente funziona, in contrasto con la risposta accettata.
Irfy

mostra solo un paio di pacchetti per me --- sicuramente ne mancano molti.
Rmano,

Lo stesso qui, sicuramente mancano i pacchetti installati manualmente, subito dopo averli installati.
David Ljung Madison

L'uso di sys.exit(1)senza import syspotrebbe causare un errore nelle versioni più recenti di Python. O import sysutilizzare exit(1).
Videonauth,

7

Per ottenere un elenco di tutti i pacchetti (non installati, installati dall'utente o installati per impostazione predefinita, su tutti i PPA), aptutilizza il seguente metodo:

apt list [option]

Le possibili opzioni utili per questo sono:

--installed per visualizzare solo i pacchetti installati sul sistema (su circa 50.000+)

--manual-installedper elencare i pacchetti che sono stati esplicitamente installati da un comando, direttamente o come dipendenze.

In alternativa, potresti fare:

apt list --manual-installed | grep -F \[installed\] per ottenere un elenco di pacchetti risultanti solo dai comandi utente e dalle relative dipendenze e per ottenere informazioni aggiuntive su di essi come la versione e l'architettura supportate (x86, x86_64, amd64, all, ecc.)


5

Come diverse persone hanno commentato, lo showmanual di apt-mark sembra essere un po 'difettoso (e l'ho segnalato come bug 727799 ). Quando lo sto usando, in realtà riporta molte cose che non sono nemmeno registrate in / var / lib / apt / extended_states (dove si suppone che questo sia memorizzato) e apt-get non sta registrando le cose come installate in / var / lib / apt / extended_states (solo in / var / lib / dpkg / status). Lo script python di txwikinger sopra attinge direttamente da / var / lib / apt / extended_states ma se lo stai usando oggi la sintassi potrebbe non funzionare (la mia ha appena iniziato a generare errori con Kubuntu 13.10). La sintassi aggiornata è:

#!/usr/bin/python
import sys

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
    pkgname = tagfile.section.get("Package")
    autoInst = tagfile.section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

Per me questo era un elenco molto breve di 5 articoli che non sembra neanche accurato.


1
L'uso di sys.exit(1)senza import syspotrebbe causare un errore nelle versioni più recenti di Python. O import sysutilizzare exit(1).
Videonauth,

4

Vorrei dare una soluzione GUI.

inserisci qui la descrizione dell'immagine

  1. Aperto Synaptic Package Manager

  2. Vai a Status

  3. Clic Installed (manual)

Fornirà l'elenco dei pacchetti installati manualmente da apt o aptitude.

Purtroppo non sono riuscito a trovare alcuna opzione Custom Filtersper scoprire se un foobarpacchetto è stato installato manualmente o automaticamente.

Se il pacchetto è sotto Installedma non sotto, Installed (manual)è stato installato automaticamente. Se il pacchetto è sotto, Installed (manual)è stato installato manualmente.


2

Se nessuno ti dà una bella risposta usando un comando apr-qualcosa puoi farlo nel modo più difficile . Apt-get memorizza le sue informazioni in / var / lib / apt / extended_states. Qualsiasi file installato automaticamente verrà aggiunto a questo file. Se installi un pacchetto già in questo file manualmente, il pacchetto rimarrà in questo file ma con Autoinstallato: 0 nella seconda riga. Non è cancellato

Nota: come previsto, risposte migliori che potrebbero funzionare se sono apparse modifiche al posizionamento dei file. Tengo il mio nel caso in cui le informazioni sulla posizione del file siano utili.


1
No. Ho dato una rapida occhiata a quel file per scoprire che liferea era contrassegnato come autoinstallato. L'ho fatto apt-get install lifereae non è stato installato, ma ho ottenuto un output che aveva l'effetto di "contrassegnato come installato manualmente". Ora liferea è ancora nel file, tranne per il fatto che la riga successiva ha un 0anziché un 1. Inoltre, dovresti cambiare il tuo pattern regex in " foobar$"invece che semplicemente foobar.
Umang,

È vero. Colpa mia, nel mio sistema non esiste una linea con 0, ma dovrebbe accadere un evento raro. Aggiornamento la risposta per ogni evenienza.
Javier Rivera,

2

Dopo aver cercato su Google molto, sono riuscito a montare questo script. Funziona bene per me:

# List of all packages currently installed
current=$(dpkg -l | awk '{print $2}' | sort | uniq)

# List of all packages that were installed with the system
pre=$(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort | uniq)

# List of packages that don't depend on any other package
manual=$(apt-mark showmanual | sort | uniq)

# (Current - Pre) ∩ (Manual)
packages=$(comm -12 <(comm -23 <(echo "$current") <(echo "$pre")) <(echo "$manual") )

for pack in $packages; do
    packname=$(echo $pack | cut -f 1 -d ":")
    desc=$(apt-cache search "^$packname$" | sed -E 's/.* - (.*)/\1/')
    date=$(date -r /var/lib/dpkg/info/$pack.list)

    echo "# $desc"
    echo "# $date"
    echo "sudo apt-get install $pack"
    echo -e ""
done

È possibile utilizzare sort -uinvece di sort | unique. Poiché apt-marknon visualizza l'architettura, è necessario rimuoverla dall'output di dpkg prima delle operazioni impostate (o utilizzare dpkg-query -W -f='${Package}\n'). Inoltre, dpkg potrebbe elencare alcuni pacchetti che non sono attualmente installati. Per quanto riguarda "desc", potresti usare `dpkg-query -W -f = '# $ {binario: Riepilogo} \ n' $ pack, che è più veloce.
jarno,

Oh, apt-markpuò visualizzare l'architettura per alcuni pacchetti, ma non per così tanti dpkg -l.
jarno,

apt-cache searchè lento. Ottenere in anticipo un elenco di date installate utilizzando qualcosa come help.ubuntu.com/community/ListInstalledPackagesByDate potrebbe essere più efficiente
opticyclic

1

Come ha detto Li Lo, apt-mark showautodovresti procurarti un lungo elenco di cose installate automaticamente.

Ora per mostrare le cose che vengono installate manualmente, si scopre che c'è un adorabile semplice modificatore di ricerca per aptitude. Ma non vuoi farlo. Vuoi scrivere un enorme comando bash che fa un po 'di scienza missilistica.

Nota: questo è più un esempio di quanto apparirai figo lanciando enormi comandi bash a tutti i tuoi amici.

comm -3  <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=' ' -f 1) <(apt-mark showauto)

L'ho rotto su due righe per leggibilità. Cosa fa questo?

  • Per prima cosa chiediamo a dpkg un elenco di pacchetti installati.
  • Filtriamo quelli per quelli effettivamente installati (non solo configurazione residua)
  • Tagliamo lo stato
  • Confrontiamo tale elenco con l'elenco automatizzato di apt-mark
  • Scuotiamo perché possiamo.

Dubito che sia accurato, poiché dpkg mostra spesso pacchetti che non sono installati
txwikinger

So cosa intendi, ma il mio bash-fu non è abbastanza forte. So che potresti mostrare lo stato da dpkg-query, grep down e quindi tagliare lo stato. Ci proverò.
Oli

comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)è propriamente migliore;)
LassePoulsen,

-1

Verranno elencati tutti i pacchetti installati manualmente senza: dipendenze, pacchetti disinstallati, pacchetti installati durante l'installazione del sistema.

unopts() {
  in=`cat`
  echo "$in" | sed -r 's/ --[^ ]+//g;s/ -[^ ]+//g'
}

list() {
  cat '/var/log/apt/history.log' |
  grep --color=never -v '\-o APT::Status-Fd=4 \-o APT::Keep-Fds::=5 \-o APT::Keep-Fds::=6' |
  egrep --color=never "Commandline: apt-get.* $1" |
  sed -r "s/Commandline: apt-get//;s/ $1//" |
  unopts |
  tr ' ' '\n' |
  sed '/^$/d'
}

hapt() {
  tmp=`mktemp -d`
  installed=$tmp/installed
  deleted=$tmp/deleted
  dpkg=$tmp/dpkg
  list 'install' > $installed
  list '(remove|purge|autoremove)' > $deleted
  dpkg --get-selections |
  grep -v 'deinstall' |
  cut -f 1 > $dpkg
  while read package
  do
    sed -i "0,/$package/{//d;}" $installed
  done < $deleted
  while read package
  do
    if [ -z "`grep --color=never "^$package$" $dpkg`" ]
    then
      sed -i "0,/$package/{//d;}" $installed
    fi
  done < $installed
  cat $installed
  rm -r $tmp
}
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.