Come trovare i pacchetti installati manualmente?

47

Ho installato una semplice Ubuntu 10.10 sul mio computer e ho installato del software tramite apt-get. La scorsa settimana sono riuscito a rompere tutto e ho iniziato da zero, e ho bisogno di reinstallare il mio software. C'è un modo per creare un elenco con tutti i pacchetti che ho installato manualmente?

In modo che mi desse una lista come texlive, ... e non texlive, texlive-dep1, textlive-dep2, ... e tutti i pacchetti standard rimossi?

Se potessi capire in qualche modo quali programmi sono stati rimossi dall'installazione normale che ho rimosso, sarebbe fantastico!

Aggiornamento 2015-05-23: Ora utilizzo Ansible come gestione della configurazione sui miei sistemi. Lì, specifica i pacchetti da installare. Questo serve all'obiettivo, installando tutti i programmi su un nuovo sistema, ancora meglio. Quindi questa domanda potrebbe essere l'entrata in una leggera gestione della configurazione.

    
posta Martin Ueding 25.03.2011 - 17:47

15 risposte

2

Finalmente ho capito:

outfile="$(mktemp)"
pattern='(\[INSTALLIEREN\]|\[INSTALL\])'

if [[ -f "/var/log/aptitude.1.gz" ]]
then
        gunzip -c /var/log/aptitude.*.gz | grep -E "$pattern" | awk '{ print ; }' > "$outfile"
fi

if [[ -f "/var/log/aptitude" ]]
then
        grep -E "$pattern" "/var/log/aptitude" | awk '{ print ; }' >> "$outfile"
fi

sort "$outfile"
rm "$outfile"
    
risposta data Martin Ueding 09.08.2011 - 23:18
25

Con questo suggerimento, suppongo che la tua vecchia installazione sarà ancora avviata!

Per replicare un set di pacchetti su un altro computer:

Sul sistema A, corri:

dpkg --get-selections | grep -v deinstall > my-selections

Sposta il file my-selections su Sistema B.

Nel sistema B, esegui:

dpkg --set-selections < my-selections

e poi:

sudo apt-get dselect-upgrade

Nota importante: se hai installato pacchetti da repository e / o PPA non standard, dovrai anche copiare /etc/apt/sources.list e il contenuto di /etc/apt/sources.list.d/ dal Sistema A al Sistema B prima di eseguire l'aggiornamento.

Puoi utilizzare dpkg per vedere anche quello che hai rimosso (NB: questo includerà anche i pacchetti che hai installato manualmente e ):

dpkg --get-selections | grep deinstall

Puoi vedere i risultati nel terminale o, naturalmente, reindirizzare a un file.

    
risposta data Mark Russell 25.03.2011 - 18:11
19

Questo thread di superuser.com fornisce questa soluzione:

aptitude search '?installed ?not(?automatic)'
    
risposta data Jason 02.05.2011 - 19:34
10

Se i tuoi registri apt sono in / var / log / apt, qualcosa di simile dovrebbe funzionare:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install"

O se vuoi eliminare alcuni dei rifiuti indesiderati nell'output:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install" \
  | cut -f4- -d" " | sort | uniq
    
risposta data Mzzzzzz 17.10.2013 - 23:21
6

Potresti utilizzare apt-mark , ma ti consiglio < a href="http://manpages.ubuntu.com/manpages/precise/en/man8/debfoster.8.html"> debfoster :

sudo apt-get install debfoster
sudo debfoster

Questo controllerà tutti i pacchetti installati e capirà quali sono gli altri che mantengono installati:

texlive-full is keeping the following 161 packages installed:
  cm-super cm-super-minimal context doc-base dvipng feynmf
  fonts-gfs-artemisia fonts-gfs-baskerville fonts-gfs-bodoni-classic
  ...
Keep texlive-full? [Ynpsiuqx?], [H]elp:

Mentre rispondi "y" a ciascuna domanda (basta premere Invio per spostarti rapidamente), debfoster raccoglierà la lista dei pacchetti e li scriverà linea per riga in un file. Di default questo è a /var/lib/debfoster/keepers . Assomiglia a questo:

gnome-do
texlive-full
...

Configuro debfoster tramite /etc/debfoster.conf per inserire questo elenco in /etc/debfoster-keepers e traccia il file con etckeeper per mantenere la cronologia e backup. La risposta qui mostra come installare un elenco di pacchetti da un file di testo delimitato da una nuova riga:

sudo apt-mark manual $(cat debfoster-keepers)

Nota una limitazione qui, i pacchetti che hai eliminato hanno un '-' di fronte a loro. Quindi vuoi rimuovere quelle linee prima di chiamare apt-mark.

Anche se il sito web di debfoster dice che debfoster è deprecato a favore di aptitude, preferisco la semplice e rapida configurazione di debfoster. Ti mette nel mezzo del tuo database dei pacchetti e ti consente di ripulire le cose, rendendo i pacchetti auto e manuali più ovvi.

Scrivi "h" al prompt di debfoster per spiegare le tue opzioni. Genere "?" per vedere la descrizione del pacchetto. L' how-to qui potrebbe essere utile.

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

Fornisce tutti i pacchetti installati manualmente (non i pacchetti di sistema, non le dipendenze). Per esempi mostra build-essential ma non gcc .

    
risposta data ecerulm 22.05.2015 - 17:38
2

Sono in grado di estrarre tutto aprendo i file di registro in / var / log / apt /

Vado quindi a filtrare manualmente i pacchetti di installazione di apt-get. Potrebbe esserci un modo per farlo in modo programmatico ma non ne sono a conoscenza.

    
risposta data marty331 25.04.2013 - 18:42
1
cd /var/log/apt
cat  history.log | grep Commandline

in questo modo viene visualizzato l'elenco dei comandi eseguiti in passato.

Rimuovi il codice grep se ti servono ulteriori informazioni:

less history.log

se il log è compresso (ad es. end with gz)

gunzip <filename>

per chiuderlo nuovamente quando hai finito puoi fare:

gzip <filename>
    
risposta data Zen 02.07.2013 - 17:32
1

Non ho visto nessuna soluzione per me, ho installato alcuni pacchetti deb con dpkg e alcuni degli elementi che cercavo erano mancanti.

Un rivestimento piuttosto lungo, ma comodo da copiare e incollare sarebbe:

export DPKG_INITIAL=$(mktemp) DPKG_INSTALLED=$(mktemp) DPKG_CUSTOM=$(mktemp) DPKG_DEPS=$(mktemp) zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print  }' > $DPKG_INITIAL ; awk ' !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", ) ; gsub(/:.+/, "", ) ; a[]= } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > $DPKG_INSTALLED ; comm -23 installed initial > $DPKG_CUSTOM ; function rdep() { apt-cache rdepends  | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; } ; echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > $DPKG_DEPS ; comm -23 custom deps > my-packages ; rm $DPKG_INITIAL $DPKG_INSTALLED $DPKG_CUSTOM $DPKG_DEPS

Il comando precedente salva un elenco di pacchetti in un file nella directory di lavoro corrente denominata my-packages .

Spiegazione

Ho prima creato un elenco di pacchetti che compongono la linea di base dei pacchetti selezionati durante l'installazione.

zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print  }' > initial

Seguito da un lungo elenco di elementi installati in generale.

awk ' !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", ) ; gsub(/:.+/, "", ) ; a[]= } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > installed

Ho quindi confrontato i due file initial e installed per elencare solo gli elementi unici da installare.

comm -23 installed initial > custom

Da lì ho voluto filtrare le dipendenze, questo è dove questo metodo può perdere alcuni pacchetti desiderati, non è consapevole delle dipendenze che sono anche esplicitamente installate.

Ho scritto una rapida funzione bash per abbreviare questi passaggi nell'elaborazione di questi elementi.

function rdep() { apt-cache rdepends  | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }

Dopo di che ho passato ogni riga dal mio file custom in questa funzione con xargs .

echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > deps

Una volta che ho avuto la lunga lista di tutte le possibili dipendenze, (non sono sicuro su ogni possibile affermazione), ho ottenuto ancora una volta le linee che erano uniche per un singolo file.

comm -23 custom deps > manual

E il mio elenco completo di pacchetti è ora in un file chiamato manual disponibile per me da recensire.

    
risposta data Steve Buzonas 14.04.2015 - 14:52
1

Per coloro che preferiscono usare gli strumenti apt- *, esiste un'utilità di selezione apt-mark che consente sia l'interrogazione che la modifica dello stato manuale / automatico.

apt-mark showmanual

Puoi anche specificare il modello per i pacchetti che ti interessano:

apt-mark showmanual qemu\*
    
risposta data Alexander Koptelov 30.01.2017 - 17:21
0

Qualcuno collegato a link che ha una buona soluzione, ma, non si comporta correttamente come l'output di aptitude è cambiato. Ecco una versione aggiornata, basata sui pacchetti attualmente installati rispetto a 12.04 LTS. Avrai bisogno di aptitude installato, che è l'unico requisito.

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled && wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f 1 | sort -u > defaultinstalled && comm -23 currentlyinstalled defaultinstalled

Per suddividere il comando precedente in parti, questo bit emette un pacchetto per riga di tutto ciò che è installato sul sistema

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled

E questo scarica l'elenco e l'elenco dei pacchetti predefiniti ritaglia le informazioni ridondanti.

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

e comm confronta i due file e restituisce i pacchetti che non sono nell'elenco di default.

comm -23 currentlyinstalled defaultinstalled
    
risposta data johndrinkwater 13.10.2013 - 19:56
0

Utilizza un file manifest di distribuzione come set di pacchetti di base. Ordina i risultati installati manualmente in gruppi di pacchetti per architettura e sezione, quindi è più facile concentrarsi su gruppi di pacchetti (forse non ti interessa di alcune sezioni).

link

#!/bin/bash

manifest_url='http://releases.ubuntu.com/releases/trusty/ubuntu-14.04.3-desktop-amd64.manifest'
manifest_file=$(echo $manifest_url | sed -e 's#.*/##g')
if [ ! -e $manifest_file ]; then
    wget -q $manifest_url
fi
cat $manifest_file | cut -f1 | sort -u > default_installed.txt

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

comm -23 currently_installed.txt default_installed.txt > manually_installed.txt

# sort the 'mannually_installed.txt' packages by architecture and section
mkdir -p package_files
while read p; do
    apt-cache show $p > info.txt
    arch=$(grep -m1 'Architecture: ' info.txt | sed -e 's/Architecture: //')
    section=$(grep -m1 'Section: ' info.txt | sed -e 's/Section: //' -e 's/\//_/g')
    file="${arch}_${section}_packages.txt"
    echo $p >> "package_files/$file"
done <manually_installed.txt

rm info.txt
    
risposta data Darren Weber 29.09.2015 - 07:38
0
#! /bin/sh
DEFAULT='tempfile'
CURRENT='tempfile'
cat /var/log/installer/initial-status.gz | gzip -d | grep '^Package:' | awk '{ print }' | sort -u > $DEFAULT
aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' | awk '{ print }' > $CURRENT
comm -23 $CURRENT $DEFAULT
rm $DEFAULT
rm $CURRENT
    
risposta data Hir0 22.02.2014 - 14:39
0

Non ne ho trovato uno adatto a me, quindi ho scritto una sceneggiatura. Analizzando i contenuti di /var/log/apt/history.log* e / var / log / aptitude, quindi ordina per datetime, risultante in due liste, una viene installata manualmente pkgs, un'altra viene installata ma rimossa pkgs. Script con verifica 'apt list'. una piccola deviazione, perché l'uso di dpkg installato e modificato fonte PPA.

Ho inserito qui link .

se qualcuno ha bisogno di testarlo, forse è necessario modificare del codice, perché i miei file di registro sono misti in cinese e inglese (specialmente il formato datetime RFC2822), ho bisogno di gestirlo.

    
risposta data utopic eexpress 20.03.2017 - 20:40
0

Penso che tu voglia utilizzare /var/log/apt/history.log e i suoi amici per dare le modifiche che sono state fatte:

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt(?:-get)? install (?!.*--reinstall)\K.*'

(Modificato da source )

Ti fornirà tutti i pacchetti che sono stati installati sulla riga di comando utilizzando una variazione di apt-get install .

Ottiene i file compressi nel vecchio history.log s li aggiunge con il corrente history.log e passa attraverso grep, estraendo le linee con apt [-get] install [e / o reinstall] e mostrando il resto della riga (-o flag) che equivale al nome del pacchetto.

Questo richiederà un po 'di modding (es. con sed ) se vuoi solo i nomi dei pacchetti su linee separate; un esercizio per il lettore!

Vale la pena notare che il gestore di pacchetti synaptic ( gksu synaptic o kdesudo synaptic ) nella sezione "stato" ha un elenco "installato (manualmente)". Se contrassegni l'intero elenco per la rimozione [non applicarlo !!] dovresti essere in grado di salvare le modifiche contrassegnate e ottenere un elenco di pacchetti in questo modo. Attenzione: questo bloccato per synaptic per me (calcolando presumibilmente le rimozioni di dipendenza).

    
risposta data pbhj 04.02.2018 - 17:37

Leggi altre domande sui tag