Trova tutti i pacchetti installati dall'utente


38

Esiste un modo per ottenere un elenco di tutti i pacchetti installati dall'utente su un sistema Ubuntu, ovvero i pacchetti che sono stati installati sopra i pacchetti installati predefiniti?

(L'idea è quella di ottenere un elenco completo che può essere utilizzato per installare gli stessi pacchetti su un'installazione Ubuntu pulita)

Risposte:


15

Guarda questi file,

  1. ' /var/log/installer/initial-status.gz' - la tua installazione principale
    • questa data del file sarebbe la tua data di installazione (penso)
    • ' /var/log/dpkg.log' cronologia degli aggiornamenti (questo è quello che vuoi)
    • ' /var/log/apt/term.log' - cose aptaggiornate sul tuo sistema
    • ' /var/cache/apt/archives/'conterrà i debpacchetti scaricati per l'installazione

Aggiornamento: utilizzare i seguenti due passaggi per l'elenco esatto delle nuove installazioni:

  1. eseguire: grep -w install /var/log/dpkg.log > full-list.log
  2. Guarda le righe oltre il /var/log/installer/initial-status.gztimestamp

Dato che si desidera ottenere un'installazione pulita su un altro sistema con questi pacchetti, è anche possibile copiare i file "deb" dal percorso "cache / apt / archives" a quello della nuova installazione e installarli in un colpo solo (senza scaricare loro di nuovo).


Grazie per il consiglio. È utile, anche se cercavo di più un singolo comando per ottenere questo elenco. cat /var/log/dpkg.log | grep 'install' sembra avvicinarsi se ignoro gli elementi installati fino alla data / ora di installazione
Rabarberski,

L'aggiunta di un motivo per il voto negativo aiuterebbe a comprendere un problema nella risposta, se ce n'è uno. Porterebbe anche a risposte migliori in futuro.
nik

Oeps, il downvote è stato accidentalmente mio. Avevo già votato per la tua risposta. Quando ho provato a contrassegnare la tua risposta come "finale", ho sbagliato a scrivere e ho premuto la freccia del voto verso il basso. Nel tentativo di annullare, è stato visualizzato il messaggio: "Vota troppo vecchio per essere modificato, a meno che questa risposta non venga modificata". Scusate nik, sia per il downvote che per la confusione. :-(
Rabarberski,

@Rabarberski, beh, succede ... nessun danno fatto.
nik,

non funziona se / var / log / installer non esiste, come su un'installazione server. Inoltre avrebbe senso aggiungere i NUMERI DI VERSIONE se stai parlando di "Ubuntu" - quale Ubuntu?

8

Solo per sorridere, ho messo insieme un one-liner (qui diviso per chiarezza) che individua i pacchetti installati manualmente , esclusi quelli installati inizialmente e tutti i pacchetti installati automaticamente:

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) \
  )

Funziona sia dentro bashche dentro zsh.


Funziona quasi perfettamente, tranne che sembra stampare un mucchio di librerie installate durante l'installazione iniziale. C'è un sacco di libtiff, libxcbecc. Che non ho installato da solo. Questa risposta: superuser.com/a/105000/24349 si occupa di ciò ordinando in base al tempo di installazione e rimuovendo tutto prima del tempo di installazione del sistema. Ottimo (ab) uso della shell!
haxney,

3

Sulla base delle informazioni di cui sopra, ho scritto un breve script Python per elencare i pacchetti installati manualmente. Vedere questo link .

Sentiti libero di usarlo anche se non me ne assumo alcuna responsabilità. Tuttavia, feedback e suggerimenti sono sempre ben accetti.


Brillante! Ci vuole un po 'di tempo per funzionare, ma è l'unica soluzione che ho trovato che fa esattamente quello di cui ho bisogno!
haxney,

2
Sfortunatamente il collegamento è ora interrotto (mostra un traceback di Python) che dimostra il valore di inserire la risposta qui (specialmente per un "breve script di Python"
David Ljung Madison Stellar

Trovato un repository github con lo script: github.com/gerjantd/bin/blob/master/… Fai clic su 'raw' per scaricare ed esegui con 'python list_manually_installed_packages.py'
David Ljung Madison Stellar

2
Anche il collegamento github ora è rotto ...
Suzana,


1

supponendo che tu abbia una storia coerente e usi aptitude:

history | grep -e "^..... aptitude install"

elencherebbe solo i pacchetti installati con aptitude install ... duh


1

Questo è un lavoro di hacking, ma funziona completamente.

Per prima cosa, vai a http://releases.ubuntu.com/maverick/ (o qualsiasi versione di Ubuntu che stai utilizzando) e prendi *.manifest filequello associato alla versione di Ubuntu che stai utilizzando.

Quindi, esegui il seguente script (sostituzione <manifest file>, parentesi angolari e tutto, con il percorso del file scaricato. Puoi sempre aggiungere > outputalla fine per creare un dump del file.

diff --suppress-common-lines <(sed 's/ .*//' <manifest file>) <(dpkg --get-selections | sed 's/[ \t].*//') | grep '>' | sed 's/[>] //'

1

Grazie geekosaur, bel codice. L'ho usato ma ci è voluto del tempo per capire come farlo funzionare. Ecco come l'ho fatto in Ubuntu 11.10 — funziona nel terminale bash:

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) \
  ) > user-installed-packages

Quindi per aggiungere una scheda \t—e installsu ogni riga:

sed 's/$/\tinstall/' user-installed-packages >uip

Quindi sulla nuova macchina:

sudo dpkg --set-selections < uip

E per installare i pacchetti:

sudo apt-get dselect-upgrade

0

Un altro modo per farlo è determinare cosa è stato installato in base alle "attività" che determinano i pacchetti di base da installare in base alle proprie esigenze iniziali.

tasksel --list-tasks

Per lo meno avresti server. Tuttavia, puoi scegliere di averne di più. Per ognuna di quelle attività che hai installato, puoi ottenere un elenco di pacchetti che sono installati il ​​seguente comando fa tutto in una riga (suddiviso per chiarezza) per quelli che ho scelto nella mia installazione:

(tasksel --task-packages server ; \
 tasksel --task-packages openssh-server ; \
 tasksel --task-packages lamp-server) | sort | uniq

Un approccio generico a quanto sopra sarebbe:

(for a in $( tasksel --list-tasks | grep "^i" | awk '{ print $2 }' ) ; \
 do tasksel --task-packages $a; done) | sort | uniq

Ora usa apt-cache depends --installed -i --recurse <packagename> | grep -v "^ "per ottenere un elenco di dipendenze utilizzate da tutti i pacchetti definiti nell'attività. Questo può essere fatto in una riga come segue

apt-cache depends --installed -i --recurse \
     $(for a in $( tasksel --list-tasks | \
                   grep "^i" | \
                   awk '{ print $2 }' ) ; \
       do tasksel --task-packages $a; done) | grep -v "^ " | sort | uniq

Di seguito sono elencati tutti i pacchetti installati nel sistema (escluse le dipendenze).

dpkg --get-selections | grep "[[:space:]]install" | awk '{print $1}'

Ora usa il commcomando per trovare quelli che sono solo nel secondo elenco (cioè ignora quelli che si trovano in entrambi i file e solo nel primo file)

comm -13 <(apt-cache depends --installed -i --recurse \
              $(for a in $( tasksel --list-tasks | \
                            grep "^i" | \
                            awk '{ print $2 }' ) ; \
                do tasksel --task-packages $a; done) | grep -v "^ " | sort ) \
         <( dpkg --get-selections | grep "[[:space:]]install" | \
            awk '{print $1}' | 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.