Wie finde ich manuell installierte Pakete?

48

Ich habe ein einfaches Ubuntu 10.10 auf meinem Computer installiert und Software über apt-get installiert. Letzte Woche habe ich es geschafft, alles zu brechen und habe gerade von vorne begonnen, und ich muss meine Software neu installieren. Gibt es eine Möglichkeit, eine Liste mit allen Paketen zu erstellen, die ich manuell installiert habe?

Damit es mir eine Liste gibt wie texlive, ...und nicht texlive, texlive-dep1, textlive-dep2, ...und alle Standardpakete entfernt werden?

Wenn ich irgendwie herausfinden könnte, welche Programme aus der regulären Installation ich entfernt habe, wäre das auch fantastisch!


Update 23.05.2015: Ich verwende jetzt Ansible als Konfigurationsmanagement auf meinen Systemen. Dort gebe ich die zu installierenden Pakete an. Dies dient dem Ziel, alle Programme auf einem neuen System zu installieren, noch besser. Diese Frage könnte also der Einstieg in ein leichtes Konfigurationsmanagement sein.

Martin Ueding
quelle

Antworten:

24

Mit diesem Vorschlag gehe ich davon aus, dass Ihre alte Installation noch startet!

So replizieren Sie einen Paketsatz auf einem anderen Computer:

Führen Sie auf System A Folgendes aus:

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

Verschieben Sie die my-selectionsDatei auf System B.

Führen Sie auf System B Folgendes aus:

dpkg --set-selections < my-selections

und dann:

sudo apt-get dselect-upgrade

Wichtiger Hinweis: Wenn Sie Pakete von nicht standardmäßigen Repositorys und / oder PPAs installiert haben, möchten Sie auch /etc/apt/sources.listdie Inhalte /etc/apt/sources.list.d/von System A auf System B kopieren, bevor Sie das Upgrade ausführen.

Mithilfe von können Sie auch dpkgsehen, was Sie entfernt haben (Hinweis: Dies schließt auch Pakete ein, die Sie manuell installiert und entfernt haben):

dpkg --get-selections | grep deinstall

Sie können Ihre Ergebnisse im Terminal anzeigen oder natürlich in eine Datei umleiten.

Mark Russell
quelle
9
Ich möchte eine Liste aller Pakete erhalten, möchte aber nur die Namen der Pakete haben, die ich explizit installiert habe. Also einfach somethingund nicht something-commonso gut.
Martin Ueding
6
Ja, das ist zwar nützlich, macht aber nicht das, was in der Frage steht.
Timmmm
3
In diesem Fall werden automatisch installierte Abhängigkeiten beim Entfernen von Programmen niemals bereinigt. Warum stimmen die Leute für eine Antwort, die genau das tut, was der Fragesteller nicht wollte?
jbo5112
20

Dieser Thread von superuser.com gibt diese Lösung:

aptitude search '?installed ?not(?automatic)'
Jason
quelle
2
Das funktioniert bei mir nicht. Listet einfach alles auf, was installiert ist, oder sicherlich mehr, als ich ausdrücklich verlangt habe.
Timmmm
Es listet alles auf, womit Sie installiert haben apt-get, sowie deren Abhängigkeiten. So zum Beispiel, wenn Sie installiert aptitude, dann wird es auch Listeapt-xapian-index aptitude-common libboost-iostreams1.54.0 libclass-accessor-perl libcwidget3 libept1.4.12 libio-string-perl libparse-debianchangelog-perl libsigc++-2.0-0c2a libsub-name-perl libtimedate-perl libxapian22 python-chardet python-debian python-six python-xapian
Runemoro
10

Wenn sich Ihre apt-Protokolle in / var / log / apt befinden, sollte Folgendes funktionieren:

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

Oder wenn Sie den sich wiederholenden Müll in der Ausgabe loswerden möchten:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install" \
  | cut -f4- -d" " | sort | uniq
Mzzzzzz
quelle
6

Sie könnten apt-mark verwenden , aber ich empfehle debfoster :

sudo apt-get install debfoster
sudo debfoster

Dadurch werden alle installierten Pakete überprüft und herausgefunden, auf welchen die anderen installiert bleiben:

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:

Wenn Sie jede Frage mit "y" beantworten (drücken Sie einfach die Eingabetaste, um sich schnell zu bewegen), sammelt debfoster die Paketliste und schreibt sie zeilenweise in eine Datei. Standardmäßig ist dies um /var/lib/debfoster/keepers. Es sieht aus wie das:

gnome-do
texlive-full
...

Ich konfiguriere debfoster über /etc/debfoster.conf, um diese Liste zu /etc/debfoster-keeperserstellen und die Datei mit etckeeper zu verfolgen zu , um Verlauf und Backups zu führen. Die Antwort hier zeigt, wie eine Liste von Paketen aus einer durch Zeilenumbrüche getrennten Textdatei installiert wird:

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

Beachten Sie hier eine Einschränkung, Pakete, die Sie gelöscht haben, haben ein '-' vor sich. Sie möchten also diese Zeilen entfernen, bevor Sie apt-mark aufrufen.

Auch wenn die Website des Debfosters besagt, dass Debfoster zugunsten von Aptitude veraltet ist, bevorzuge ich die schnelle und einfache Konfiguration von Debfoster. Es versetzt Sie in die Mitte Ihrer Paketdatenbank und ermöglicht es Ihnen, Dinge zu bereinigen und die automatischen und manuellen Pakete offensichtlicher werden.

Geben Sie an der Debfoster-Eingabeaufforderung "h" ein, um Ihre Optionen zu erläutern. Art "?" um die Paketbeschreibung zu sehen. Das How-to hier könnte nützlich sein.

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

Gibt alle manuell installierten Pakete an (keine Systempakete, keine Abhängigkeiten). Zum Beispiel zeigt es build-essentialaber nicht gcc.

ecerulm
quelle
3

Für diejenigen, die apt- * tools bevorzugen, gibt es ein Dienstprogramm, mit dem Sie den manuellen / automatischen Status abfragen und ändern können.

apt-mark showmanual

Sie können auch Muster für Pakete angeben, an denen Sie interessiert sind:

apt-mark showmanual qemu\*
Alexander Koptelov
quelle
Das ist das Ticket.
John Von Neumann
2

Ich habe es jetzt endlich verstanden:

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

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

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

sort "$outfile"
rm "$outfile"
Martin Ueding
quelle
2
Ich vermute, das funktioniert nur, wenn Sie jemals Pakete mit aptitude installiert haben. Es gibt ähnliche Dateien in /var/log/apt/history.log(.N.gz).
Timmmm
Sie können verwendet werden zgrepanstelle von gunzipoder zcatverrohrt grep. Ich glaube, es ist ein Wrapper-Skript, das mit gzip ausgeliefert wird. Es akzeptiert auch unkomprimierte Dateien, so dass Sie Ihr Skript vereinfachen könnenzgrep -E '(\[INSTALLIEREN\]|\[INSTALL\])' /var/log/aptitude* | awk '{ print $2 }'
Steve Buzonas
2

Ich kann alles abrufen, indem ich die Protokolldateien in / var / log / apt / öffne.

Ich gehe dann hinein und filtere die apt-get install-Pakete manuell heraus. Es kann einen Weg geben, dies programmatisch zu tun, aber ich bin mir dessen nicht bewusst.

marty331
quelle
1
cd /var/log/apt
cat  history.log | grep Commandline

Auf diese Weise sehen Sie die Liste der in der Vergangenheit ausgeführten Befehle.

Entfernen Sie den Grep-Code, wenn Sie weitere Informationen benötigen:

less history.log

wenn das Protokoll komprimiert ist (dh mit gz enden)

gunzip <filename>

Wenn Sie fertig sind, können Sie es erneut komprimieren:

gzip <filename>
Zen
quelle
1
Verwenden Sie, anstatt die Protokolldateien zu dekomprimieren und erneut zu komprimieren, warum nicht zcat? Es ist so einfach wie zcat filename.gz. Man kann es einfach für gzip-komprimierte Dateien anstelle von verwenden cat. Auch grepkann durch zgrepz zgrep Commandline history.log.1.gz.
LGARZO
Auf der Grundlage Ihrer Idee , die ich habe mit einer Kommandozeile kommen: (grep "Commandline" history.log ; zgrep "Commandline" history.log.*.gz ) | grep " install " | grep -v -- "--yes" | sed -r "s/^.*install //". Es weist Fehler auf, da die entfernten Pakete ebenfalls aufgelistet werden und wenn ein Paket mehrmals installiert wurde, wird es mehrmals aufgelistet.
LGARZO
1

Ich habe hier keine Lösung für mich gesehen, ich habe einige Deb-Pakete mit dpkg installiert und einige der Dinge, nach denen ich besonders gesucht habe, fehlten.

Ein ziemlich langer Einzeiler, der sich aber bequem kopieren und einfügen lässt, wäre:

export DPKG_INITIAL=$(mktemp) DPKG_INSTALLED=$(mktemp) DPKG_CUSTOM=$(mktemp) DPKG_DEPS=$(mktemp) zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > $DPKG_INITIAL ; awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } 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 $1 | 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

Der obige Befehl speichert eine Liste von Paketen in einer Datei in Ihrem aktuellen Arbeitsverzeichnis mit dem Namen my-packages.

Erläuterung

Ich habe zuerst eine Liste von Paketen erstellt, die die Grundlinie der während der Installation ausgewählten Pakete bilden.

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

Gefolgt von einer langen Liste von Elementen, die im Allgemeinen installiert sind.

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

Ich verglich dann die zwei Akten initialund installedlistete nur die Einzelteile auf, die zum installierten einzigartig sind.

comm -23 installed initial > custom

Von dort wollte ich die Abhängigkeiten herausfiltern, hier kann es vorkommen, dass bei dieser Methode einige gewünschte Pakete fehlen, es sind keine Abhängigkeiten bekannt, die auch explizit installiert werden.

Ich habe eine schnelle Bash-Funktion geschrieben, um diese Schritte bei der Verarbeitung dieser Elemente zu verkürzen.

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

Danach habe ich jede Zeile aus meiner Datei customin diese Funktion mit übergeben xargs.

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

Sobald ich die lange Liste aller möglichen Abhängigkeiten hatte (nicht sicher bei jeder möglichen Anweisung), bekam ich wieder die Zeilen, die für eine einzelne Datei eindeutig waren.

comm -23 custom deps > manual

Und meine fertige Paketliste ist jetzt in einer Datei mit dem Namen manualverfügbar, die ich überprüfen kann.

Steve Buzonas
quelle
0

Jemand, der mit https://unix.stackexchange.com/questions/3595/ubuntu-list-explicitly-installed-packages/3624#3624 verlinkt ist, hat eine gute Lösung, verhält sich aber nicht richtig als Ausgabe von aptitude hat sich verändert. Hier ist eine aktualisierte Version, basierend auf den aktuell installierten Paketen im Vergleich zu 12.04 LTS. Sie müssen aptitudeinstalliert sein, das ist die einzige Voraussetzung.

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

Um den obigen Befehl in Teile zu zerlegen, gibt dieses Bit ein Paket pro Zeile von allem aus, was auf dem System installiert ist

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

Dadurch wird die Standardpaketliste heruntergeladen und die redundanten Informationen werden abgeschnitten.

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

und commvergleicht die beiden Dateien und gibt die Pakete aus, die nicht in der Standardliste enthalten sind.

comm -23 currentlyinstalled defaultinstalled
johndrinkwater
quelle
Sie können auch auf die andere Website gehen und die Antwort dort aktualisieren.
Martin Ueding
0

Verwenden Sie eine Verteilungsmanifestdatei als Basispaket. Sortieren Sie die manuell installierten Ergebnisse nach Architektur und Abschnitt in Paketgruppen, damit Sie sich leichter auf Gruppen von Paketen konzentrieren können (möglicherweise interessieren Sie sich nicht für einige Abschnitte).

https://gist.github.com/darrenleeweber/8cc570ff402f19af7fa4

#!/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
Darren Weber
quelle
Es wäre einfach, die Paketdateien so zu ändern, dass jeder Zeile ein Präfix vorangestellt wird apt-get install -y und die Datei ein Bash-Skript ist. Dann könnten alle Paketdateien in eine Vagrant-Bereitstellungsschleife aufgenommen werden.
Darren Weber
0
#! /bin/sh
DEFAULT=`tempfile`
CURRENT=`tempfile`
cat /var/log/installer/initial-status.gz | gzip -d | grep '^Package:' | awk '{ print $2}' | sort -u > $DEFAULT
aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' | awk '{ print $1}' > $CURRENT
comm -23 $CURRENT $DEFAULT
rm $DEFAULT
rm $CURRENT
Hir0
quelle
0

Ich habe kein passendes für mich gefunden, also habe ich ein Drehbuch geschrieben. Durch Analyse des Inhalts von /var/log/apt/history.log* und / var / log / aptitude und anschließende Sortierung nach Datum und Uhrzeit werden zwei Listen erstellt, wobei eine manuell installierte und eine installierte, aber entfernte pkgs. Skript mit Bestätigung der 'Apt-Liste'. eine kleine abweichung, da die verwendung von dpkg als ppa quelle installiert und modifiziert.

Ich habe hier, https://github.com/eexpress/eexp-bin/blob/master/self-installed-pkg.pl .

Wenn jemand es testen muss, möglicherweise Code ändern muss, da meine Protokolldateien in Chinesisch und Englisch (insbesondere RFC2822-Datum / Uhrzeit-Format) gemischt sind, muss ich damit umgehen. Bildbeschreibung hier eingeben

utopischer Ausdruck
quelle
Was ist das für ein unlesbarer Textwand-Screenshot?
muru
Es ist meine Skriptausgabe. Aber heute finde ich, dass der DNF von Fedora effektiver ist. "dnf history" zeigt eine reine Historie des Paketbetriebs.
utopic eexpress
0

Ich denke, Sie möchten /var/log/apt/history.logund seine Freunde verwenden, um die vorgenommenen Änderungen zu geben:

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

(Geändert von der Quelle )

Gibt Ihnen alle Pakete, die in der Befehlszeile mit einer Variation von installiert wurden apt-get install.

Es werden die komprimierten Dateien in den alten history.logs mit den aktuellen addiert history.logund grep durchlaufen, wobei Zeilen mit apt [-get] install [und / oder restart] extrahiert werden und der Rest der Zeile (-o flag) angezeigt wird, der dem entspricht Paketname (n).

Dies erfordert eine kleine Modifikation (zB mit sed), wenn Sie nur die Paketnamen in separaten Zeilen haben möchten. eine Übung für den Leser!

Es ist erwähnenswert, dass der Synaptic Package Manager ( gksu synapticoder kdesudo synaptic) im Abschnitt "Status" eine Liste "Installiert (Manuell)" hat. Wenn Sie die gesamte Liste zum Entfernen markieren [nicht anwenden !!], sollten Sie in der Lage sein, die markierten Änderungen zu speichern und auf diese Weise eine Liste der Pakete zu erhalten. Achtung: das hat synapticfür mich gesperrt (Berechnung der Abhängigkeitsentfernungen vermutlich).

pbhj
quelle
Kopiert von meiner Antwort an anderer Stelle.
pbhj