Liste explizit installierter Pakete

53

In Gentoo gibt es die Datei /var/lib/portage/world, die Pakete enthält, die ich explizit installiert habe. Mit explizit meine ich Pakete, die ich auswähle, die nichts standardmäßig installiertes oder von den Abhängigkeiten gezogenes enthalten.

Gibt es eine ähnliche Datei oder einen Befehl, um diese Informationen in Ubuntu zu finden?

phunehehe
quelle

Antworten:

46

Nur der Code

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest \
  | cut -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt

Erläuterung

Eine Möglichkeit, über dieses Problem nachzudenken, besteht darin, es in drei Teile zu unterteilen:

  • Wie erhalte ich eine Liste der Pakete, die nicht als Abhängigkeiten installiert wurden?
  • Wie erhalte ich eine Liste der standardmäßig installierten Pakete?
  • Wie kann ich den Unterschied zwischen diesen beiden Listen feststellen?

Wie erhalte ich eine Liste der Pakete, die nicht als Abhängigkeiten installiert wurden?

Der folgende Befehl scheint auf meinem System zu funktionieren:

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

Ähnliche Ansätze finden Sie in den Links, die Gilles als Kommentar zur Frage gepostet hat. Einige Quellen behaupten, dass dies nur funktioniert, wenn Sie die Pakete mit aptitude installiert haben. Ich nutze jedoch fast nie aptitude, um Pakete zu installieren, und stellte fest, dass dies immer noch funktionierte. Das --disable-columnsverhindert, dass aptitude Zeilen mit Paketnamen mit Leerzeichen auffüllt, die den folgenden Vergleich behindern würden. Das | sort -usortiert die Datei und entfernt Duplikate. Dies erleichtert den letzten Schritt erheblich.

Wie erhalte ich eine Liste der standardmäßig installierten Pakete?

Hinweis: Dieser Abschnitt beginnt mit einem "falschen Pfad", der meiner Meinung nach nur zur Veranschaulichung dient. Der zweite Code ist derjenige, der funktioniert.

Das ist etwas kniffliger. Ich dachte anfangs, dass eine gute Annäherung alle Pakete sein würden, die Abhängigkeiten der Metapakete ubuntu-minimal, ubuntu-standard, ubuntu-desktop und der verschiedenen Linux-Kernel-bezogenen Pakete sind. Einige Ergebnisse bei Google-Suchen schienen diesen Ansatz zu verwenden. Um eine Liste dieser Abhängigkeiten zu erhalten, habe ich zuerst Folgendes versucht (was nicht funktioniert hat):

$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u

Dies scheint einige Pakete auszulassen, von denen ich weiß, dass sie standardmäßig kommen mussten. Ich glaube immer noch, dass diese Methode funktionieren sollte, wenn man die richtige Liste von Metapaketen erstellt.

Es scheint jedoch, dass Ubuntu-Spiegel eine "Manifest" -Datei enthalten, die alle Pakete der Standardinstallation enthält. Das Manifest für Ubuntu 12.04.3 ist hier:

http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest

Wenn Sie diese Seite durchsuchen (oder die Seite eines Spiegels in Ihrer Nähe):

http://mirror.pnl.gov/releases/precise/

Sie sollten in der Lage sein, die ".manifest" -Datei zu finden, die der von Ihnen verwendeten Version und Architektur entspricht. So extrahieren Sie nur die Paketnamen:

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

Die Liste war wahrscheinlich bereits sortiert und eindeutig, aber ich wollte sichergehen, dass sie richtig sortiert war, um den nächsten Schritt zu vereinfachen. Ich habe dann die Ausgabe in defaultinstalled.txt.

Wie kann ich den Unterschied zwischen diesen beiden Listen feststellen?

Dies ist der einfachste Teil, da die meisten Unix-ähnlichen Systeme viele Tools haben, um dies zu tun. Das commTool ist eine von vielen Möglichkeiten, dies zu tun:

comm -23 currentlyinstalled.txt defaultinstalled.txt

Dies sollte die Liste der Zeilen drucken, die für die erste Datei eindeutig sind. Daher sollte eine Liste der installierten Pakete gedruckt werden, die nicht in der Standardinstallation enthalten sind.

Steven D
quelle
Was macht Ihre erste Pipeline, was aptitude search '~i!~M' -F %pnicht?
Ephemient
@ephemient: Wahrscheinlich nichts. Ich weiß nicht viel über Eignung und verwende daher Tools, die ich kenne, anstatt in der Man-Datei eines Programms zu stöbern, das ich nie benutze.
Steven D
1
Sie zerstören irgendwie meine Hoffnung, ich dachte, es gäbe einen einfachen Standardweg :(
phunehehe
3
Das funktioniert fast, ist aber immer noch nicht richtig. Es gibt mehrere Pakete und Bibliotheken, die ich in der resultierenden Liste nicht manuell installiert habe. Ich benutzte http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifestund die zusätzlichen | sed "s/ *$//"aber noch keine Würfel.
Jmiserez
1
Der erste Schritt, bei dem eine Liste der Pakete apt-mark showmanual | sort -uangezeigt wird, die nicht als Abhängigkeiten installiert wurden, kann durch ersetzt werden , wie in anderen Antworten gezeigt. Einfacher und hängt nicht davon ab, aptitudewelche nicht standardmäßig installiert ist.
Skagedal
24

Sie können einen dieser beiden Einzeiler verwenden. Beide liefern auf meiner Maschine exakt die gleiche Leistung und sind präziser als alle bisher (Juli 2014) in dieser Frage vorgeschlagenen Lösungen. Sie sind eine Kombination der beiden Antworten (1) und (2) . Beachten Sie, dass ich diese Antwort ursprünglich hier gepostet habe .

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 die andere Datei dies tut.

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

jmiserez
quelle
Wenn Sie Ihr System seit Ihrer Erstinstallation aktualisiert haben (was meiner Meinung nach für die meisten Leute der Fall ist), ist es besser, die Manifest-Datei Ihrer aktuellen Ubuntu-Release-Version zu verwenden.
Diego V
Wenn Sie ein Upgrade durchgeführt haben, müssen Sie wahrscheinlich beide Dateien verwenden, nicht nur die Manifest-Datei. Sie können dies einfach tun, indem Sie einen weiteren Vergleich hinzufügen. Die Manifest-Datei enthält leider nicht alles, was die Datei initial_status.gz tut (ich habe es überprüft).
jmiserez,
Ich bin beeindruckt! Ich fand jedoch ein fehlendes Stück. Was ist mit Paketen, die ursprünglich installiert und dann explizit manuell entfernt , später jedoch explizit manuell neu installiert wurden ? Ich fand das in einem funktionierenden System.
n611x007
1
Ich habe eine unix.SE/225330-Frage gestellt: Listen Sie explizit entfernte Pakete (apt) auf, um den Großteil des Auftrags zu bearbeiten .
n611x007
1
Das ist besser als die akzeptierte Lösung, da die mirror.pnl.gov/releases/precise/... URL in der akzeptierten Lösung ist nun ein 404.
rmunn
9

Nach man apt-mark:

apt-mark showauto
apt-mark showmanual
mmaruska
quelle
2
showmanualzeigt Dinge wie xserver-xorg-video-vesa, die ich nicht manuell installiert habe.
Phunehehe
Wahrscheinlich wird es von Ihrer Distribution bei der Erstinstallation automatisch installiert.
Matt
8

Hier ist eine Beispielausgabe von cat /var/log/apt/history.log:

Start-Date: 2011-01-22  00:43:38
Commandline: apt-get --target-release experimental install libdbus-1-dev
Upgrade: libdbus-1-3:i386 (1.4.0-1, 1.4.1-1), libdbus-1-dev:i386 (1.4.0-1, 1.4.1-1)
End-Date: 2011-01-22  00:43:48

Start-Date: 2011-01-23  01:16:13
Commandline: apt-get --auto-remove purge webcheck
Purge: python-utidylib:i386 (0.2-6), python-beautifulsoup:i386 (3.1.0.1-2), libtidy-0.99-0:i386 (20091223cvs-1), webcheck:i386 (1.10.3)
End-Date: 2011-01-23  01:16:31

Was deine Frage betrifft, filtere das Zeug mit grep ( cat /var/log/apt/history.log | grep Commandline).

Beachten Sie, dass diese Dateien gedreht werden. Suchen Sie nach anderen Dateien, damit Sie nichts verpassen:

$ ls /var/log/apt/history.log*
-rw-r--r-- 1 root root 69120 2011-01-23 18:58 /var/log/apt/history.log
-rw-r--r-- 1 root root 19594 2011-01-01 02:48 /var/log/apt/history.log.1.gz

HINWEIS :

  • Ich habe sowohl geprüft aptitude und synaptic (Versionen 0.70 und 0.6.3 jeweils), und sie beide einloggen , um ihre Aktivitäten auf dieser Protokolldatei. Der einzige Nachteil bei ihnen ist, dass sie nicht die Zeile haben, mit der sie beginnen Commandline, also grepfunktioniert der Trick bei ihnen nicht.
Tshepang
quelle
2
Interessante Lösung. Sie müssen den Befehl grep etwas anpassen, um eine Liste der Pakete zu erhalten und die von aptitudeund anderen Paketmanagern installierten Pakete zu berücksichtigen . Wenn sich Ihre Protokolle abgewendet haben, haben Sie Pech.
Steven D
@ steven Aktualisiert. Mein Grep-Fu ist ein Anfänger, also überlasse ich das dem Leser. Ich weiß auch nicht, ob sich das Ding wegdreht. Ich muss dort nur selbst Akten ablegen.
Tshepang
Ob sie sich wegdrehen, hängt von Ihrem Logrotate-Setup ab und davon, wie lange Ihr System schon in Betrieb ist. Ich bin mir nicht sicher, welche Ubuntu-Standardeinstellungen ich verwendet habe, da ich sie schon lange nicht mehr geändert habe.
Steven D
7

Ich bin auf diesen wunderschönen Oneliner gestoßen, als ich nach dieser Frage gesucht habe

Der eine Liner ist

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )`

Dieser Oneliner filtert vom System installierte Pakete mithilfe von Protokollen von /var/log/installer/initial-status.gz

Ich werde den Link zum Original-Thread posten, wenn ich ihn gefunden habe, da dieser Oneliner nicht von mir stammt und ich mich anscheinend nicht erinnern kann, wo ich ihn gesehen habe.

Archit
quelle
3

Sie möchten einen Blick auf diesen Artikel werfen .

Am Ende des Artikels befindet sich ein Python-Skript, das tun soll, was Sie wollen.

Es wurde für (k) Ubuntu geschrieben . sollte aber auch für Ubuntu funktionieren.

Stefan
quelle
3
der link scheint nicht mehr zu funktionieren.
Rog
2
Gebrochene Links wie diese sind der Grund, warum es wichtig ist, die relevanten Informationen in Ihre Antwort aufzunehmen.
Whitehat101
2

Unten finden Sie eine Ergänzung zu Steven Ds Antwort .

In der folgenden Zeile werden Paketnamen mit 32 Zeichen abgeschnitten:

aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt

Das scheint zu funktionieren:

aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt

siehe diese Antwort

Wes Turner
quelle
1

Auschecken /var/log/apt/term.log

Joril
quelle
2
Das ist eine ziemlich schmerzhafte Methode, und es gibt keinen Unterschied zwischen Paketen, die ich selbst installiere, und solchen, die von Abhängigkeiten erstellt wurden
phunehehe
Ich bin damit einverstanden, aber ich wusste nicht, dass Apt den Überblick behält: / Jetzt weiß ich es, danke an Stefan :)
Joril 29.10.10
1

Sie können sich auch die Datei ansehen /var/lib/apt/extended_states.

cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'

Dies ist nützlich, wenn Sie wissen möchten, was auf einer alten Partition installiert wurde.

Laurent Lyaudet
quelle
0

Vielen Dank und herzlichen Glückwunsch an alle, die dieses Juwel eines Drehbuchs erfunden haben !!!
Ich wollte meine 2 ¢ hinzufügen und habe das Installationsdatum angeheftet, das ich aus $ info abgeleitet habe.
Ich habe die Details, warum und wann $ info-Dateien aktualisiert werden, nicht verstanden, aber es funktioniert in der Praxis.
Mein Skript listet die neuesten Aktualisierungen von nicht abhängigen Paketen auf, die nach der Installation hinzugefügt wurden.
Bei einer regelmäßigen Überprüfung stellte ich fest, was ich ohne einen einzigen Fehler manuell protokolliert hätte.
Dies bedeutet, dass aus demselben Grund mehrere Pakete installiert wurden. Leider brechen Updates diese Reihenfolge.
Nach einem System-Upgrade hatte ich eine Liste meiner hinzugefügten Pakete, die nicht aktualisiert wurden, gefolgt von den Paketen, die aktualisiert wurden.
Ordentlich! Genießen.

info='/var/lib/dpkg/info/'

comm -13 > /tmp/packages \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

while read n; do
  echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
    | tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*/\1/') $n
done < /tmp/packages | sort
Papou
quelle