Creazione dell'elenco di pacchetti installati manualmente e interrogazione di singoli pacchetti

145

Vorrei ottenere un elenco di pacchetti installati manualmente da apt o aptitude ed essere in grado di scoprire se un pacchetto foobar è stato installato manualmente o automaticamente. C'è un modo pulito per farlo dalla riga di comando?

    
posta Umang 16.08.2010 - 19:07
fonte

12 risposte

164

Puoi usare uno di questi due one-liner. Entrambi producono esattamente lo stesso risultato sulla mia macchina e sono più precisi di tutte le soluzioni proposte finora (6 luglio 2014) in questa domanda.

Uso di apt-mark :

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

Uso di 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 ancora cadono attraverso le fessure, anche se sospetto che questi siano effettivamente installati dall'utente, subito dopo l'installazione attraverso l'impostazione di localizzazione della lingua o e.g. tramite il programma di installazione del codec Totem. Inoltre, anche le versioni di linux-header sembrano accumularsi, anche se ho solo installato 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 aptitude, l'ulteriore sed rimuove gli spazi bianchi rimanenti alla fine della riga.
  2. Ottieni l'elenco dei pacchetti installati subito dopo una nuova installazione.
  3. Confronta i file, emetti solo le righe nel file 1 che non sono presenti nel file 2.

Altre possibilità non funzionano altrettanto bene:

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

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

Entrambi elencano più pacchetti rispetto alla soluzione precedente.

EDIT: cosa fare se hai eseguito l'upgrade da una versione precedente:

Se hai aggiornato Ubuntu da una versione all'altra, probabilmente dovrai modificare questa procedura. In tal caso, controllerei il file manifest della versione più recente (vedi sopra) oltre al file initial-status.gz della versione corrente. Puoi farlo facilmente aggiungendo un altro confronto. Usare solo il file manifest non funzionerà, poiché il file manifest purtroppo non contiene tutto ciò che fa il file initial_status.gz (ho controllato).

    
risposta data jmiserez 06.07.2014 - 17:01
fonte
53

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

apt-mark showmanual
    
risposta data Daniel Alder 17.05.2012 - 18:21
fonte
19

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

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

    
risposta data Li Lo 16.08.2010 - 19:32
fonte
11

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

Ad esempio:

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

Non è perfetto, ma è abbastanza buono per chiarire esattamente ciò che ho installato a mano. Metti un -B 1 su grep 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 preleva aptitude o no. Non sembra raccogliere le installazioni dall'app desktop Ubuntu Software.

    
risposta data s1037989 04.02.2017 - 19:48
fonte
8

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.

    
risposta data txwikinger 16.08.2010 - 21:42
fonte
5

Come diverse persone hanno commentato, apt-mark showmanual sembra essere un po 'buggato (e l'ho segnalato come bug 727799 ). Quando lo sto usando, in realtà segnala un sacco di cose che non sono nemmeno loggate in / var / lib / apt / extended_states (dove questo dovrebbe essere memorizzato) e apt-get non sta loggando cose come installato in / var / lib / apt / extended_states (solo in / var / lib / dpkg / status). Lo script python di txwikinger sopra disegna direttamente da / var / lib / apt / extended_states ma se lo si utilizza oggi la sintassi potrebbe non funzionare (il mio 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 è stato un elenco molto breve di 5 elementi che non sembrano accurati neanche.

    
risposta data cluelesscoder 27.10.2013 - 01:28
fonte
4

Per ottenere un elenco di tutti i pacchetti (non installati, installati dall'utente o installati di default, su tutti i PPA), apt utilizza 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-installed per elencare i pacchetti che sono stati esplicitamente installati da un comando, direttamente o come dipendenze.

In alternativa, puoi fare:

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

    
risposta data Aalok 07.02.2017 - 15:01
fonte
2

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

# List of all packages currently installed
current=$(dpkg -l | awk '{print }' | 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/.* - (.*)//')
    date=$(date -r /var/lib/dpkg/info/$pack.list)

    echo "# $desc"
    echo "# $date"
    echo "sudo apt-get install $pack"
    echo -e ""
done
    
risposta data dufferZafar 31.05.2015 - 22:28
fonte
1

Come diceva Li Lo, apt-mark showauto dovrebbe farti installare una lista di cose automaticamente installate.

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

Nota: questa è più un'illustrazione di quanto sei cool con i massimi comandi di 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 infilato su due righe per essere leggibile. Cosa fa?

  • Per prima cosa chiediamo dpkg per un elenco di pacchetti che sono installati.
  • Filtriamo quelli per quelli effettivamente installati (non solo per la configurazione residua)
  • Ritagliamo lo stato
  • Confrontiamo quell'elenco con l'elenco automatizzato da apt-mark
  • Scavalchiamo perché possiamo.
risposta data Oli 16.08.2010 - 19:41
fonte
1

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

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

    
risposta data Javier Rivera 16.08.2010 - 19:44
fonte
0

Vorrei dare una soluzione GUI.

  1. Apri Synaptic Package Manager

  2. Vai a Status

  3. Fai clic su Installed (manual)

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

Purtroppo non sono riuscito a trovare alcuna opzione in Custom Filters per scoprire se un pacchetto foobar è stato installato manualmente o automaticamente.

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

    
risposta data blueray 28.05.2018 - 17:39
fonte
-1

Questo elencherà 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.* " |
  sed -r "s/Commandline: apt-get//;s/ //" |
  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
}
    
risposta data wieczorek1990 08.10.2014 - 15:39
fonte

Leggi altre domande sui tag