it-swarm-eu.dev

Liste der manuell installierten Pakete erstellen und einzelne Pakete abfragen

Ich möchte eine Liste der manuell von apt oder aptitude installierten Pakete erhalten und herausfinden, ob ein foobar -Paket manuell oder automatisch installiert wurde. Gibt es eine gute Möglichkeit, dies von der Kommandozeile aus zu tun?

182
Umang

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

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

Sehr wenige Pakete fallen immer noch durch die Risse, obwohl ich vermute, dass diese tatsächlich vom Benutzer installiert werden , entweder direkt nach der Installation über das Sprachlokalisierungssetup oder z. über das Totem-Codec-Installationsprogramm. 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 sed das verbleibende Leerzeichen 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.manifest -Datei ( 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 showauto anstelle von /var/log/installer/initial-status.gz. apt-mark enthält beispielsweise nicht das Paket xserver-xorg, während die andere Datei dies tut.

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

205
jmiserez

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

apt-mark showmanual
64
Daniel Alder

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

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 einen -B 1 auf das 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 dies aptitude aufnimmt oder nicht. Es scheint keine Installationen von der Ubuntu-Software-Desktop-App zu übernehmen.

21
s1037989

apt-mark showauto | grep -iE '^foobar$' gibt "foobar" aus, 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 auf Ubuntu Desktop ab 10.10 sein wird.

20
Li Lo

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.

8
txwikinger

Um eine Liste aller Pakete (nicht installiert, vom Benutzer installiert oder standardmäßig installiert, über alle PPAs hinweg) abzurufen, verwendet apt 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-installed, um 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 abzurufen, die nur aus Benutzerbefehlen und deren Abhängigkeiten resultieren, und um zusätzliche Informationen zu diesen abzurufen, z. B. die unterstützte Version und Architektur (x86, x86_64, AMD64 usw.).

6
Aalok

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.

5
cluelesscoder

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

enter image description here

  1. Öffne Synaptic Package Manager

  2. Gehe zu Status

  3. Klicken Sie auf Installed (manual)

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

Leider konnte ich in Custom Filters keine Option finden, um herauszufinden, ob ein foobar -Paket manuell oder automatisch installiert wurde.

Befindet sich das Paket unter Installed, jedoch nicht unter Installed (manual), wurde es automatisch installiert. Wenn sich das Paket unter Installed (manual) befindet, wurde es manuell installiert.

4
blueray

Wenn Ihnen niemand eine nette Antwort mit einem apr-something-Befehl gibt, können Sie dies auf die harte Weise 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 über den Speicherort der Datei nützlich sind.

2
Javier Rivera

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
2
dufferZafar

Wie Li Lo sagte, sollte apt-mark showauto Ihnen eine fette Liste von Dingen bringen, die automatisch installiert werden.

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 Ihren Freunden massive Bash-Befehle erteilen.

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.
1
Oli