Wie erhalte ich die Liste der installierten Pakete ohne Abhängigkeiten?

8

Das Software Center zeigt irgendwie eine ziemlich kurze Liste der installierten Pakete. Wie bekomme ich es in eine Textdatei?

Ich habe es versucht:

> dpkg --get-selections|wc -l
3265

> aptitude search '~i!~M'|wc -l
1181

> dpkg -l | grep ^ii | sed 's_  _\t_g' | cut -f 2|wc -l
3076

> dpkg --get-selections | grep -v deinstall|wc -l
3076

> apt-mark showmanual|wc -l
1181

Ich weiß, dass ich einige Dutzend Pakete installiert habe, nicht Tausende. Ich brauche in der Liste genau Pakete, die ich ohne Abhängigkeiten ausgewählt habe, um sie zu überprüfen.

AKTUALISIEREN

Vielen Dank an @kos, ich habe endlich die Liste mit diesem Befehl bekommen:

> zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt-get install \K.*' | tr ' ' '\n' | grep -v '\-\-reinstall'|grep -v '\-\-force-yes'|grep -v '\-y'|grep -v '\-f'|sort|uniq wc -l
103
zuba
quelle
askubuntu.com/a/492343/320386 ist hierfür eine nützliche Quelle.
Arronical

Antworten:

11

Dies beantwortet die Frage nicht genau: Es gibt vielmehr einen Befehl zum Auflisten aller apt-get installjemals ausgeführten Befehle sowie einige Hinweise zum weiteren Parsen der Liste, um eine Liste aller apt-get installjemals ausgeführten Befehle mit Ausnahme der von Ubiquity ausgeführten Befehle zu erhalten. da scheint die perfekte lösung für diese aufgabe nicht zu existieren.

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline:(?= apt-get)(?=.* install ) \K.*'
  • zcat /var/log/apt/history.log.*.gz: dekomprimiert alle komprimierten aptAnmeldungen /var/log/apt, verkettet sie und druckt auf stdout;
  • cat - /var/log/apt/history.log: anhängt /var/log/apt/history.logund druckt an stdout;
  • grep -Po '^Commandline:(?= apt-get)(?=.* install ) \K.*': wählt nur die Zeilen aus, Commandline: apt-getdie installmit einem führenden und einem nachfolgenden Leerzeichen beginnen, und druckt den Rest jeder ausgewählten Zeile auf stdout;

Dadurch wird die Liste aller apt-get installjemals ausgeführten Befehle ausgegeben (die einzige nicht berücksichtigte Ausgabe könnte ein apt-get-non- installBefehl sein, der ein installPaket erwähnt, aber dieses Paket existiert (noch?) Zumindest in den Standard-Repositorys nicht).

Hinweis: In meiner Installation (Ubuntu 15.04 64-Bit) sind die ersten vier aufgeführten Befehle diejenigen, die von Ubiquity während der Installation ausgeführt werden. Um diese auszuschließen, können Sie die Ausgabe an sedfolgende Adresse weiterleiten :

sed '1,4d'

Damit wäre der letzte ungefähre Befehl für Ubuntu 15.04 64-Bit:

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline:(?= apt-get)(?=.* install ) \K.*' | sed '1,4d'
kos
quelle
Das sieht fast so aus, wie ich es wollte, aber es enthält viele Zeilen
neu
zcat war das, was mir fehlte. Meins ist im Vergleich dazu eine langwierige Methode!
Arronical
Das sieht gut aus, aber es gibt auch Zeilen wie -f, -y, -force-yes. Übrigens, vielen Dank !!! Ich akzeptiere deine Antwort. Können Sie meinen aktualisierten Befehl in der Frage überprüfen?
Zuba
Ich freue mich darauf, es zu sehen!
zuba
OK! Und Grüße !!!
Zuba
6
apt-mark showmanual

Sie erhalten eine Liste aller manuell installierten Pakete ohne Abhängigkeiten. Wichtig ist, dass auch angezeigt wird, welche Pakete während des Ubuntu-Setups installiert wurden.

So schreiben Sie die Ausgabe in eine Datei:

apt-mark showmanual> somefile

Es gibt tatsächlich viele andere Möglichkeiten, beispielsweise die Verwendung dieses Befehls

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

Obwohl ich absolut keine Ahnung habe, wie das oben funktioniert;)

So zeigen Sie die nach Datum installierten Pakete an:

Pakete nach Datum Verwendung installierten cat /var/log/dpkg.log | grep "\ install\ > somefile"
Pakete installiert mit dpkgEinsatz ls -l /var/log/dpkg* > somefile- dies ist wahrscheinlich das, was Sie suchen.

So zeigen Sie mit dpkg installierte Pakete an:

Diese Datei enthält die oben genannten Informationen: /var/log/dpkg.log

Sag mir warum
quelle
Ich bezweifle, dass ich wirklich 1181 Pakete ausgewählt habe. `` `> apt-mark showmanual | wc -l
1181`
@zuba Der Grund ist, dass alle Pakete, die während des Ubuntu-Setups installiert wurden, auch als manuell gekennzeichnet sind.
Nephente
Ich verstehe es. Wie kann ich die Pakete auswählen, die ich nach der Installation manuell ausgewählt habe? Kann ich zB Pakete mit Installationsdatum auswählen, um solche mit Datum nach dem Installationsdatum herauszufiltern?
zuba
@zuba Ich habe jetzt hinzugefügt, wie Pakete nach Datum installiert
angezeigt werden
@ DevRobot. Könnten Sie einen Link angeben, wo Sie diesen Befehl gefunden haben? Es ist wirklich geschickt. Ich hatte keine Ahnung, über die initial-status.gz:-)
Nephente
2

Dies ist tatsächlich komplizierter als es scheint, und es gibt einige ähnliche Fragen zu Ask Ubuntu.

Ich habe festgestellt, dass beim Betrachten /var/log/apt/history.logund in den älteren Versionen dieses Protokolls alle von einem apt-get installBefehl installierten Elemente als von diesem Befehl installiert aufgeführt werden.

Damit:

grep "apt-get install" /var/log/apt/history.log

Zeigt Ihnen alle für den Zeitraum an, den das aktuelle Apt-Verlaufsprotokoll abdeckt. Sie müssen gunzipIhre älteren Protokolle aufrufen und diese abrufen, um alle Ihre Informationen zusammen zu erhalten. Die grep-Befehle könnten alle in eine Textdatei umgeleitet werden, um Ihnen eine schöne Liste zu geben.

Dies ist wahrscheinlich nur dann nützlich, wenn Software Center apt-get installbei der Installation verwendet. Ich weiß, dass Software Center ein Frontend ist, bin mir aptaber nicht sicher, ob es diesen Befehl explizit verwendet.

Arronisch
quelle
0

Hier ist ein Ruby-Skript, das mit rdepends überprüft, ob ein Paket eine Abhängigkeit für ein anderes installiertes Paket darstellt. Das sagt nicht genau, was Sie ausgewählt haben, aber das hängt nicht von Ihren Protokolldateien ab (die möglicherweise gedreht wurden).

Durch das Installieren von Paketen, die als Root-Pakete aufgeführt sind, werden alle in untergeordneten Paketen aufgeführten Pakete installiert. Sie sollten also fast (siehe Nachteile unten) dieselbe Paketliste haben.

Die untergeordnete Liste zeigt die Pakete an, die Abhängigkeiten von anderen untergeordneten Paketen oder Root-Paketen sind.

Dieser Ansatz weist einige Nachteile auf:

  • Einige Pakete werden möglicherweise nicht als root aufgeführt, wenn sie Abhängigkeiten von einem optionalen, empfohlenen Paket sind, das Sie ausgewählt haben. Zum Beispiel auf meinem Server apache2bei Kindern Pakete aufgeführt ist , weil ich auch haben libapache2-mod-php, libapache2-mpm-itkund python-letsencrypt-apacheinstalliert , die haben apache2als Abhängigkeit.
  • Zyklische Abhängigkeiten (Pakete, die direkt oder indirekt voneinander abhängen) werden in untergeordneten Paketen aufgeführt (zum Beispiel: libapache2-mod-phpund libapache2-mod-php7.0). Es gibt einen Abschnitt, in dem der wahrscheinliche Zyklus aufgeführt ist (überprüfen Sie die Paket-Vorfahren für 5 Generationen). Sie sollten ihn einschließen, um dieselbe Liste von Paketen zu erhalten (es sei denn, ich habe etwas anderes übersehen).
#!/usr/bin/env ruby

class ListRootPackages
  def run
    count = manual_marked_packages.count
    @dependencies ||= {}

    @root_packages ||= begin
      manual_marked_packages.each_with_index.map do |package, index|
        STDERR.print "   #{index + 1} / #{count} \r"

        intersection = manual_marked_packages & reverse_dependencies(package)

        if intersection.any?
          @dependencies[package] = intersection
          nil
        else
          package
        end
      end.compact
    end
  end

  def potential_cyclic_dependences
    run

    @potential_cyclic_dependences ||= @dependencies.keys.map do |package|
      package unless has_root_ancestor?(package, 5)
    end.compact
  end

  def has_root_ancestor?(package, level=0)
    return true if @root_packages.include?(package)
    return false if level.zero?

    @dependencies[package].any? { |parent| has_root_ancestor?(parent, level - 1) }
  end

  def root_packages
    run
    @root_packages
  end

  def dependencies
    run
    @dependencies
  end

  def manual_marked_packages
    @manual_marked_packages ||= parse_cli_list(`apt-mark showmanual`)
  end

  private

  def reverse_dependencies(package)
    parse_cli_list(`apt-cache rdepends #{package}`)[2..-1]
  end

  def parse_cli_list(list)
    list.split("\n").map(&:strip)
  end
end

list = ListRootPackages.new
list.run

puts "===== Root Packages (#{list.root_packages.count}) ====="
puts list.root_packages.join("\n")
puts

puts "===== Children packages (#{list.dependencies.count}) ====="
puts list.dependencies.map { |package, parents| "#{package}: #{parents.join(', ')}" }.join("\n")
puts

puts "===== Potential cyclic dependencies (#{list.potential_cyclic_dependences.count}) ====="
puts list.potential_cyclic_dependences.join(", ")

Wenn jemand das in Bash oder Python konvertieren möchte, wäre das schön, da Ruby weniger häufig auf Servern installiert wird als Bash oder Python.

ybart
quelle