Frage Liste manuell installierter Pakete erstellen und einzelne Pakete abfragen


Ich möchte eine Liste der manuell installierten Pakete erhalten apt oder aptitude und herausfinden können, ob a foobar Paket wurde manuell oder automatisch installiert. Gibt es eine nette Möglichkeit, das von der Befehlszeile aus zu tun?


146
2017-08-16 17:07


Ursprung


Sehen diese Antwort auf unix.stackexchange.com für eine Lösung, die Lagerbestände ausfiltert. - Dirk Bergstrom
Mögliches Duplikat? - askubuntu.com/questions/365 - jrg♦
mögliches Duplikat von Ist es möglich zu sagen, welche Pakete ich installiert habe, die nicht in der Vanille-Installation sind? - Jorge Castro
Wirklich gute Lösung, die standardmäßig installierte Pakete ausschließt: Ubuntu-Liste explizit installierte Pakete - pcworld
Beachten Sie die Kommentare der Antworten hier. Die Leute sagen nicht, dass viel mehr Pakete auftauchen, aber sie vergessen, dass Abhängigkeiten von einem installierten Handbuch installiert sind. - Andre Figueiredo


Antworten:


Sie können einen dieser beiden Einzeiler verwenden. Beide liefern genau die gleiche Leistung auf meiner Maschine und sind genauer als alle bisher vorgeschlagenen Lösungen (6. Juli 2014) in dieser Frage.

Verwenden apt-mark:

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

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

Sehr wenige Pakete fallen immer noch durch die Risse, obwohl ich diese vermute sind tatsächlich installiert durch den Benutzer, entweder direkt nach der Installation durch den Sprachlokalisierungsaufbau oder z.B. durch den Totem-Codec-Installer. Auch die Linux-Header-Versionen scheinen sich zu akkumulieren, obwohl ich nur das nicht versionsspezifische Metapaket installiert habe. Beispiele:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Wie funktioniert es:

  1. Holen Sie sich die Liste der manuell installierten Pakete. Für die Eignung, die zusätzliche sed Entfernt den verbleibenden Leerraum am Ende der Zeile.
  2. Holen Sie sich die Liste der installierten Pakete direkt nach einer Neuinstallation.
  3. Vergleichen Sie die Dateien, geben Sie nur die Zeilen in Datei 1 aus, die in Datei 2 nicht vorhanden sind.

Andere Möglichkeiten funktionieren nicht so gut:

  • Verwendung der ubuntu-14.04-desktop-amd64.manifest Datei (Hier für Ubuntu 14.04) statt /var/log/installer/initial-status.gz. Mehr Pakete werden als manuell installiert angezeigt, obwohl sie nicht installiert sind.
  • Verwenden apt-mark showauto Anstatt von /var/log/installer/initial-status.gz. apt-mark zum Beispiel enthält das xserver-xorg-Paket nicht, während die andere Datei tut.

Ich habe verschiedene andere StackExchange-Posts als Referenzen verwendet, aber keine funktioniert so gut wie die obige Lösung:

Beide Listen mehr Pakete als die obige Lösung.

EDIT: Was tun, wenn Sie von einer früheren Version aktualisiert haben:

Wenn Sie Ubuntu von einem Release auf das nächste aktualisiert haben, müssen Sie diesen Prozess wahrscheinlich anpassen. In diesem Fall würde ich die Manifest-Datei der neueren Version (siehe oben) zusätzlich zur Datei initial-status.gz aus der aktuellen Version prüfen. Sie können dies einfach tun, indem Sie einfach einen weiteren Vergleich hinzufügen. Nur die Manifest-Datei zu verwenden funktioniert nicht, da die Manifest-Datei leider nicht alles enthält, was die initial_status.gz-Datei tut (ich habe das geprüft).


165
2017-07-06 15:01



Das hat bei mir nicht funktioniert /var/log/installer/initial-status.gz wird vermisst. Auch ich möchte wissen, ob dies abhängig von der apts Markierung von ist manual oder nicht? - Anwar
Leider gibt es kein Manifest für Serverversionen. - Antti Haapala
Ich lief die showmanual Befehl (unten). Und benutzen comm um die zwei (sortierten) Listen zu vergleichen. Das showmanual Ergebnis gab mir 1.840 Mehr einzigartige Pakete von apt-mark showmanual nicht mit dieser Methode gezeigt. KEINE Pakete waren einzigartig für die Ausgabe von diesem comm-Befehl. Ich denke, es ist interessanter, das für meinen PC aufzunehmen, 894 Pakete sind in beiden Ergebnissen aufgelistet. Nicht sicher, warum es so eine große Diskrepanz gibt. Einige (viele?) Pakete scheinen releasespezifisch zu sein. Andere wie XOrg, GTK-Komponenten und lib* Dinge könnten Updates sein. Sowieso Diese Antwort ist ein sehr guter Anfang. - will
Ich habe nur Ihre Lösungen mit verglichen apt-mark showmanual. Es ist interessant, wie viele Unterschiede sichtbar sind. Ihre Liste enthält 238 Pakete, während showmanual 1717 Pakete zurückgibt. Von den 2179 installierten Paketen gibt es in beiden Listen nur 223, 15 nur in Ihrem (Beispiele: nodejs, lightdm) und 223 nur im Showmanual (Beispiele: xserver-xorg, ubuntu-desktop). Es fühlt sich an, als wäre deine Liste hilfreicher, aber ohne zu wissen, woher diese Unterschiede kommen, ist es nicht leicht zu entscheiden ... (aber ich bin mir ziemlich sicher, dass ich nginx und lightdm manuell installiert habe) [sorry, dass ich gerade geschrieben habe das Gleiche ;)] - Daniel Alder


In neueren Versionen des Pakets apt gibt es auch den Befehl apt-mark

apt-mark showmanual

54
2018-05-17 16:21



Genau die Antwort, nach der ich gesucht habe. - Wolfer
Dies zeigt viel mehr Pakete als ich manuell installiert habe. - Umang
@Umang Du hast Recht. Ich würde sagen, das war nicht so, als ich diese Antwort schrieb. Es gibt keinen Grund auf meinem System zu berücksichtigen linux-image-3.11.0-*-generic usw. als Handbuch - Daniel Alder
@Umang vielleicht wird dir das helfen askubuntu.com/questions/432743/ ..., aber die Antwort wird nicht akzeptiert. Fakt ist, dass viele Pakete einer Neuinstallation bereits als manuell markiert sind. Aber es gibt immer noch seltsame Dinge. Um bei meinem Beispiel zu bleiben: linux-image-3.13.0-24-generic ist manuell, aber die aktuelle linux-image-3.13.0-27-generic ist automatisch. Es scheint, dass ein Upgrade eines referenzierenden Pakets (in diesem Fall linux-image-generic, die die Abhängigkeiten geändert haben), wird die manuelle Markierung automatisch gesetzt - Daniel Alder
@DanielAlder einige Pakete einer Neuinstallation sollten als manuell gekennzeichnet werden. Wenn keine Pakete als manuell gekennzeichnet sind, könnte das gesamte System mit gelöscht werden apt-get autoremove. Das ist definitiv nicht das, was du willst. - Anton K


apt-mark showauto | grep -iE '^foobar$' wird "foobar" ausgeben, wenn das Paket automatisch installiert wurde, sonst nichts.

aptitude search '!~M ~i' listet die Pakete auf, die nicht automatisch installiert wurden. Es ist schade, dass aptitude ab 10.10 nicht Teil der Standardinstallation auf Ubuntu Desktop sein wird.


19
2017-08-16 17:32



aptitude searchzeigt ALLE Pakete an, nicht nur die, die manuell installiert werden (ich nehme an, das ist was das OP wollte) - Oli♦
@Oli: Suche in Eignungssuchmuster; Das Muster, das ich dort verwende, sollte genau das tun, was das OP will. - Li Lo
ich lief es. Es zeigt eine ganze Ladung von Paketen, die nicht installiert sind. - Oli♦
Mein Fehler. Korrigiert. Vielen Dank. - Li Lo
Da stimmt etwas nicht, ich benutze es aptitude search '!~M ~i' und es listet 1043 Pakete auf. Es gibt keine Möglichkeit, diese Pakete manuell zu installieren. - ThatGraemeGuy


Unter Ubuntu 16.04 sollten Sie sich die Log-Datei ansehen /var/log/apt/history.log.

Beispielsweise:

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

Es ist nicht perfekt, aber es ist ziemlich gut, genau zu verdeutlichen, was ich von Hand installiert habe. Setzen Sie a -B 1 auf dem grep um zu sehen wann es installiert wurde.

Beispielausgabe

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

Nicht sicher, ob das aufgeht aptitude oder nicht. Es scheint nicht, dass die Installation von der Ubuntu Software Desktop App übernommen wird.


11
2018-02-04 18:48





Das folgende Skript druckt alle Pakete aus, die nicht auf automatische Installation eingestellt sind und daher manuell installiert wurden:

#!/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))

Es basiert darauf, wie apt-mark die automatisch installierten Pakete ausgibt.


8
2017-08-16 19:42



Kudos Ihnen gut, Herr. Dies funktioniert im Gegensatz zur angenommenen Antwort. - Irfy
zeige nur ein paar Pakete für mich - auf jeden Fall fehlen viele von ihnen. - Rmano
Das gleiche hier, definitiv fehlen manuell installierte Pakete, gleich nachdem ich sie installiert habe. - David Ljung Madison
Verwenden sys.exit(1) ohne import sys könnte in neueren Versionen von Python zu einem Fehler führen. Entweder import sys oder benutzen exit(1). - Videonauth


Wie einige Leute bemerkt haben, scheint apt-mark showmanual ein bisschen buggy zu sein (und ich berichtete es als Fehler 727799). Wenn ich es benutze, meldet es tatsächlich eine Menge Zeug, das nicht einmal in / var / lib / apt / extended_states (wo dies gespeichert werden soll) geloggt wurde und apt-get protokolliert Dinge nicht als installiert in / var / lib / apt / extended_states (gerade in / var / lib / dpkg / status). Das Python-Skript von txwikinger oben bezieht sich direkt auf / var / lib / apt / extended_states, aber wenn Sie es heute verwenden, funktioniert die Syntax möglicherweise nicht (mein Programm hat gerade angefangen, Fehler mit Kubuntu 13.10 zu erzeugen). Aktualisierte Syntax ist:

#!/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))

Für mich war dies eine sehr kurze Liste von 5 Punkten, die auch nicht genau zu sein scheint.


5
2017-10-26 23:28



Verwenden sys.exit(1) ohne import sys könnte in neueren Versionen von Python zu einem Fehler führen. Entweder import sys oder benutzen exit(1). - Videonauth


Um eine Liste aller Pakete (nicht installiert, nach Benutzer installiert oder standardmäßig installiert, über alle PPAs) zu erhalten, apt verwendet die folgende Methode:

apt list [option]

Die möglichen Optionen hierfür sind:

--installed um nur die Pakete anzuzeigen, die auf dem System installiert sind (von mehr als 50.000)

--manual-installed um die Pakete aufzulisten, die waren ausdrücklich installiert durch einen Befehl, entweder direkt oder als Abhängigkeiten.

Alternativ könnten Sie Folgendes tun:

apt list --manual-installed | grep -F \[installed\] um eine Liste von Paketen zu erhalten, die nur aus Benutzerbefehlen und ihren Abhängigkeiten resultierten, und um zusätzliche Informationen über sie zu erhalten, wie z. B. unterstützte Version und Architektur (x86, x86_64, amd64, all, etc.)


4
2018-02-07 14:01





Wie Li Lo sagte, apt-mark showauto sollten Sie eine fette Liste von Dingen automatisch installiert bekommen.

Nun, um die Dinge zu zeigen, die manuell installiert werden, stellt sich heraus, dass es einen schönen einfachen Suchmodifikator für aptitude gibt. Aber das willst du nicht tun. Sie wollen einen riesigen Bash-Befehl schreiben, der etwas Raketenwissenschaft macht.

Hinweis: Dies ist mehr ein Beispiel dafür, wie cool du aussehen wirst, wenn du all deinen Freunden massive Bash-Befehle abgibst. 

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

Ich habe es zur besseren Lesbarkeit in zwei Zeilen aufgeteilt. Was macht das?

  • Zuerst fragen wir dpkg nach einer Liste der installierten Pakete ab.
  • Wir filtern diese für diejenigen, die tatsächlich installiert sind (nicht nur Restkonfiguration)
  • Wir hacken den Status ab
  • Wir vergleichen diese Liste mit der automatisierten Liste von apt-mark
  • Wir rocken, weil wir können.

1
2017-08-16 17:41



Ich bezweifle, dass das genau ist, da dpkg oft Pakete zeigt, die nicht installiert sind - txwikinger
Ich weiß, was du meinst, aber mein Bash-Fu ist nicht stark genug. Ich weiß, dass Sie den Status von dpkg-query zeigen konnten, grep das unten und dann den Status abschneiden. Ich werde es versuchen. - Oli♦
comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort) ist richtig besser;) - LassePoulsen


Wenn niemand Ihnen eine nette Antwort mit einem apr-Befehl gibt, können Sie es tun harte Art und Weise. Apt-get speichert seine Informationen in / var / lib / apt / extended_states. Jede Datei, die automatisch installiert wird, wird dieser Datei hinzugefügt. Wenn Sie ein Paket bereits manuell in dieser Datei installieren, verbleibt das Paket in dieser Datei, jedoch mit Auto-installed: 0 in der zweiten Zeile. Es ist nicht gelöscht.

Hinweis: Wie erwartet bessere Antworten, die bei Änderungen der Dateiplatzierung wahrscheinlich funktionieren. Ich behalte meine für den Fall, dass die Information über den Speicherort der Datei nützlich ist.


1
2017-08-16 17:44



Nein. Ich habe mir die Datei kurz angesehen, um festzustellen, dass Liferea als automatisch installiert markiert wurde. Ich habe ein apt-get install liferea und es wurde nicht installiert, aber ich bekam eine Ausgabe, die etwas von "als manuell installiert" markierte. Jetzt ist Liferea noch in der Datei, außer die nächste Zeile hat eine 0 anstelle einer 1. Außerdem sollten Sie Ihr Regex-Muster zu ändern " foobar$" statt nur foobar. - Umang
Das ist richtig. Meine Schuld, in meinem System gibt es keine Linie mit 0, aber es sollte ein seltenes Ereignis sein. Ich aktualisiere die Antwort nur für den Fall. - Javier Rivera