Liste der manuell installierten Pakete erstellen und einzelne Pakete abfragen

183

Ich möchte eine Liste der manuell installierten Pakete von aptoder erhalten aptitudeund herausfinden, ob ein foobarPaket manuell oder automatisch installiert wurde. Gibt es eine gute Möglichkeit, dies von der Kommandozeile aus zu tun?

Umang
quelle
Mögliches Duplikat? - askubuntu.com/questions/365
jrg
Wirklich gute Lösung, die standardmäßig installierte Pakete ausschließt: Ubuntu listet explizit installierte Pakete auf
pcworld
Achten Sie hier auf die Kommentare der Antworten. Die Leute sagen nicht, dass mehr Pakete angezeigt werden, aber sie vergessen, dass es Abhängigkeiten gibt, die von einem installierten Handbuch installiert wurden.
Andre Figueiredo

Antworten:

206

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

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

Nur sehr wenige Pakete noch die Risse durchfallen, obwohl ich diese vermuten , sind tatsächlich vom Benutzer installiert, entweder direkt nach der Installation durch die Sprachlokalisierung Setup oder zB durch den Totem - Codec Installer. Auch die Linux-Header-Versionen scheinen sich zu häufen, 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. Rufen Sie die Liste der manuell installierten Pakete ab. Für die Eignung entfernt das zusätzliche sedLeerzeichen am Ende der Zeile.
  2. Rufen Sie die Liste der installierten Pakete direkt nach einer Neuinstallation ab.
  3. Vergleichen Sie die Dateien, und geben Sie nur die Zeilen in Datei 1 aus, die in Datei 2 nicht vorhanden sind.

Andere Möglichkeiten funktionieren nicht so gut:

  • Verwenden Sie die ubuntu-14.04-desktop-amd64.manifestDatei ( hier für Ubuntu 14.04) anstelle von /var/log/installer/initial-status.gz. Weitere Pakete werden als manuell installiert angezeigt, obwohl dies nicht der Fall ist.
  • Verwenden Sie apt-mark showautoanstelle von /var/log/installer/initial-status.gz. apt-markBeispiel: Enthält nicht das Paket xserver-xorg, während dies in der anderen Datei der Fall ist.

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

Beide Listen enthalten mehr Pakete als die oben genannte Lösung.

BEARBEITEN: Was ist zu tun, wenn Sie ein Upgrade von einer früheren Version durchgeführt haben?

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

jmiserez
quelle
7
Das hat bei mir nicht funktioniert, weil /var/log/installer/initial-status.gzes fehlt. Auch ich möchte wissen, ob dies abhängig von der APTS-Kennzeichnung ist manualoder nicht?
Anwar
1
Leider gibt es kein Manifest für Serverversionen.
Antti Haapala
Ich habe den showmanualBefehl ausgeführt (siehe unten). Und verwenden Sie comm, um die beiden (sortierten) Listen zu vergleichen. Das showmanualErgebnis gab mir 1.840 weitere einzigartige Pakete apt-mark showmanual, die mit dieser Methode nicht gezeigt wurden. NO-Pakete waren für die Ausgabe dieses commBefehls eindeutig . Ich finde es interessanter aufzuzeichnen, dass für meinen PC 894 Pakete in beiden Ergebnissen aufgeführt sind. Ich bin mir nicht sicher, warum es so große Unterschiede gibt. Einige (viele?) Pakete scheinen release-spezifisch zu sein. Andere wie XOrg, GTK-Komponenten und lib*Dinge könnten Updates sein. Auf jeden Fall ist diese Antwort ein sehr guter Anfang.
wird
Ich habe gerade 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 befinden sich nur 223 in beiden Listen, 15 nur in Ihren (Beispiele: nodejs, lightdm) und 223 nur in showmanual (Beispiele: xserver-xorg, ubuntu-desktop). Es fühlt sich an, als wäre Ihre Liste hilfreicher, aber ohne zu wissen, woher diese Unterschiede kommen, ist es nicht einfach, sich zu entscheiden ... (aber ich bin mir ziemlich sicher, dass ich nginx und lightdm manuell installiert habe ...) [Entschuldigung, dass ich gerade geschrieben habe das gleiche;)]
Daniel Alder
64

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

apt-mark showmanual
Daniel Alder
quelle
35
Dies zeigt deutlich mehr Pakete als ich manuell installiert habe.
Umang
1
@Umang Du hast recht. Ich würde sagen, das war nicht so, als ich diese Antwort schrieb. Es gibt keinen Grund auf meinem System, linux-image-3.11.0-*-genericusw. als Handbuch zu betrachten
Daniel Alder
1
@Umang vielleicht hilft dir das askubuntu.com/questions/432743/… , aber die Antwort wird nicht akzeptiert. Fakt ist, dass viele Pakete einer Neuinstallation bereits als manuell gekennzeichnet sind. Aber es gibt noch einige seltsame Dinge. Um bei meinem Beispiel zu bleiben: linux-image-3.13.0-24-genericist manuell, aber der Strom linux-image-3.13.0-27-genericist automatisch. Es scheint, dass bei einem Upgrade eines Referenzpakets (in diesem Fall linux-image-genericdas die Abhängigkeiten änderte) die manuelle Markierung automatisch gesetzt wird
Daniel Alder
5
@DanielAlder Einige Pakete einer Neuinstallation sollten als manuell gekennzeichnet werden. Wenn keine Pakete als manuell markiert sind, könnte das gesamte System mit gelöscht werden apt-get autoremove. Das ist definitiv nicht was Sie wollen.
Anton K
2
Wenn "manuell installiert" "vom Benutzer nach der Erstinstallation des Betriebssystems installiert" bedeutet, ist dies keine korrekte Antwort.
Seamus
21

Checken Sie für Ubuntu 16.04 die Protokolldatei aus /var/log/apt/history.log.

Zum Beispiel:

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

Es ist nicht perfekt, aber es ist ziemlich gut darin zu verdeutlichen, was ich von Hand installiert habe. Setzen Sie ein -B 1Häkchen, 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

Ich bin mir nicht sicher, ob dies ankommt aptitudeoder nicht. Es scheint keine Installationen von der Ubuntu-Software-Desktop-App aufzunehmen.

s1037989
quelle
1
Von allen Antworten im Laufe der Jahre ist dies die einzige, die dem Server 18.04 überhaupt nahe kommt.
Quentin Skousen
20

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 nicht Teil der Standardinstallation von Ubuntu Desktop ab 10.10 ist.

Li Lo
quelle
aptitude searchzeigt ALLE Pakete, nicht nur die, die manuell installiert wurden (ich nehme an, dass dies das ist, was das OP wollte)
Oli
1
@Oli: Aptitude-Suchmuster untersuchen; Das Muster, das ich dort verwende, sollte genau das tun, was der OP will.
Li Lo
Ich lief es. Es zeigt eine ganze Reihe von Paketen, die nicht installiert sind.
Oli
7
Irgendetwas stimmt damit nicht, ich verwende aptitude search '!~M ~i'und es werden 1043 Pakete aufgelistet. Ich habe auf keinen Fall so viele Pakete manuell installiert.
ThatGraemeGuy
Dies funktioniert definitiv nicht wie gewünscht, druckt auch vorinstallierte Pakete.
Irfy
9

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 druckt.

txwikinger
quelle
Ein großes Lob an Sie, mein Herr. Dies funktioniert tatsächlich im Gegensatz zu der akzeptierten Antwort.
Irfy
zeige nur ein paar Pakete für mich --- definitiv fehlen viele davon.
Rmano
Gleiches hier, definitiv fehlende manuell installierte Pakete, gleich nachdem ich sie installiert habe.
David Ljung Madison
Die Verwendung von sys.exit(1)without import syskann in neueren Versionen von Python zu einem Fehler führen. Entweder import sysoder verwenden exit(1).
Videonauth
7

Um eine Liste aller Pakete (nicht installiert, vom Benutzer installiert oder standardmäßig installiert, über alle PPAs hinweg) abzurufen, aptverwenden Sie die folgende Methode:

apt list [option]

Die dafür nützlichen möglichen Optionen sind:

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

--manual-installedum die Pakete aufzulisten, die explizit von einem Befehl entweder direkt oder als Abhängigkeiten installiert wurden.

Alternativ können Sie Folgendes tun:

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

Aalok
quelle
5

Wie mehrere Leute kommentiert haben, scheint das Apt-Mark-Showmanual ein bisschen fehlerhaft zu sein (und ich habe es als Fehler 727799 gemeldet ). Wenn ich es verwende, meldet es tatsächlich eine Menge Dinge, die nicht einmal in / var / lib / apt / extended_states (wo dies gespeichert werden soll) angemeldet sind, und apt-get meldet Dinge nicht als installiert an / var / lib / apt / extended_states (nur in / var / lib / dpkg / status). Das Python-Skript von txwikinger oben stammt direkt aus / var / lib / apt / extended_states, aber wenn Sie es heute verwenden, funktioniert die Syntax möglicherweise nicht (meins generiert gerade Fehler mit Kubuntu 13.10). Die aktualisierte Syntax lautet:

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

ahnungsloser Codierer
quelle
1
Die Verwendung von sys.exit(1)without import syskann in neueren Versionen von Python zu einem Fehler führen. Entweder import sysoder verwenden exit(1).
Videonauth
4

Ich möchte eine GUI-Lösung geben.

Bildbeschreibung hier eingeben

  1. Öffnen Synaptic Package Manager

  2. Gehe zu Status

  3. Klicken Installed (manual)

Es wird die Liste der manuell von apt oder aptitude installierten Pakete angezeigt.

Leider konnte ich keine Option Custom Filtersfinden, um herauszufinden, ob ein foobarPaket manuell oder automatisch installiert wurde.

Wenn das Paket unter, Installedaber nicht unter Installed (manual)ist, wurde es automatisch installiert. Wenn das Paket darunter Installed (manual)ist, wurde es manuell installiert.

Blue Ray
quelle
2

Wenn Ihnen niemand eine nette Antwort mit einem apr-something-Befehl gibt, können Sie es auf die harte Tour tun . Apt-get speichert seine Informationen in / var / lib / apt / extended_states. Jede automatisch installierte Datei wird dieser Datei hinzugefügt. Wenn Sie ein Paket, das sich bereits in dieser Datei befindet, manuell installieren, bleibt das Paket in dieser Datei, jedoch mit der Einstellung Automatisch installiert: 0 in der zweiten Zeile. Es wird nicht gelöscht.

Hinweis: Erwartungsgemäß bessere Antworten, die wahrscheinlich funktionieren, wenn sich die Dateiposition ändert. Ich behalte meine für den Fall, dass die Informationen zum Speicherort der Datei nützlich sind.

Javier Rivera
quelle
1
Ich habe mir diese Datei schnell angesehen und festgestellt, dass Liferea als automatisch installiert markiert ist. Ich habe eine ausgeführt apt-get install lifereaund es wurde nicht installiert, aber ich habe eine Ausgabe erhalten, die den Effekt "als manuell installiert markiert" hatte. Jetzt ist Liferea noch in der Datei, außer die nächste Zeile hat ein 0statt eines 1. Außerdem sollten Sie Ihr Regex-Muster auf " foobar$"anstatt auf nur ändern foobar.
Umang
Das ist richtig. Mein Fehler, in meinem System gibt es keine Zeile mit 0, aber es sollte ein seltenes Ereignis sein. Ich aktualisiere die Antwort nur für den Fall.
Javier Rivera
2

Nachdem ich viel gegoogelt habe, habe ich es geschafft, dieses Skript zusammenzustellen. Es funktioniert in Ordnung für mich:

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

    echo "# $desc"
    echo "# $date"
    echo "sudo apt-get install $pack"
    echo -e ""
done
dufferZafar
quelle
Sie könnten sort -uanstelle von verwenden sort | unique. Da apt-markdie Architektur nicht angezeigt wird, sollten Sie sie von der Ausgabe von dpkg entfernen, bevor Sie Operationen festlegen (oder verwenden dpkg-query -W -f='${Package}\n'). Außerdem listet dpkg möglicherweise einige Pakete auf, die derzeit nicht installiert sind. Was "desc" betrifft, könnten Sie "dpkg-query -W -f =" # $ {binary: Summary} \ n "$ pack verwenden, was schneller ist.
jarno
Oh, apt-markmöglicherweise wird die Architektur für einige Pakete angezeigt, jedoch nicht für so viele dpkg -l.
jarno
apt-cache searchist langsam. Das Abrufen einer Liste der installierten Daten im Voraus mithilfe von help.ubuntu.com/community/ListInstalledPackagesByDate ist möglicherweise effizienter
opticyclic
1

Wie Li Lo sagte, apt-mark showautosollte man sich eine fette Liste der Dinge automatisch installieren lassen.

Nun, um die manuell installierten Dinge zu zeigen, stellt sich heraus, dass es einen schönen einfachen Suchmodifikator für Eignung gibt. Aber das willst du nicht. Sie möchten einen riesigen Bash-Befehl schreiben, der Raketenwissenschaft leistet.

Hinweis: Dies ist eher ein Beispiel dafür, wie cool Sie aussehen werden, wenn Sie all Ihren Freunden massive Bash-Befehle geben.

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 diejenigen für diejenigen, die tatsächlich installiert sind (nicht nur die Restkonfiguration)
  • Wir hacken den Status ab
  • Wir vergleichen diese Liste mit der automatisierten Liste von apt-mark
  • Wir rocken, weil wir können.
Oli
quelle
Ich bezweifle, dass dies korrekt ist, da dpkg häufig Pakete anzeigt, die nicht installiert sind
txwikinger 16.08.10
Ich weiß, was du meinst, aber mein Bash-Fu ist nicht stark genug. Ich weiß, dass Sie den Status von dpkg-query anzeigen, diesen abfragen und dann den Status abschneiden können. Ich werde es versuchen.
Oli
comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)ist richtig besser;)
LassePoulsen
-1

Dies listet alle manuell installierten Pakete auf, ohne: Abhängigkeiten, deinstallierte Pakete, Pakete, die während der Systeminstallation installiert wurden.

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.* $1" |
  sed -r "s/Commandline: apt-get//;s/ $1//" |
  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
}
wieczorek1990
quelle