Erzeugt eine Liste manuell installierter Pakete und fragt einzelne Pakete ab

143

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 nette Möglichkeit, das über die Befehlszeile zu tun?

    
Umang 16.08.2010, 19:07
quelle

12 Antworten

163

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

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)

Sehr wenige Pakete fallen immer noch durch die Risse, obwohl ich vermute, dass tatsächlich vom Benutzer installiert werden, 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 löscht das zusätzliche sed 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:

  • Verwenden Sie stattdessen die Datei ubuntu-14.04-desktop-amd64.manifest ( hier für Ubuntu 14.04) von /var/log/installer/initial-status.gz . Weitere Pakete werden als manuell installiert angezeigt, obwohl sie nicht installiert sind.
  • Verwendung von apt-mark showauto anstelle von /var/log/installer/initial-status.gz . apt-mark zum Beispiel enthält das xserver-xorg-Paket nicht, 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 mehr Pakete als die obige Lösung.

BEARBEITEN: Was ist zu tun, wenn Sie von einer früheren Version aktualisiert haben:

Wenn Sie Ubuntu von einer Version zur nächsten aktualisiert haben, müssen Sie wahrscheinlich diesen Prozess 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 (das habe ich überprüft).

    
jmiserez 06.07.2014, 17:01
quelle
52

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

apt-mark showmanual
    
Daniel Alder 17.05.2012 18:21
quelle
19

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 von Ubuntu Desktop ab 10.10 sein wird.

    
Li Lo 16.08.2010 19:32
quelle
11

Sieh dir für Ubuntu 16.04 die Protokolldatei /var/log/apt/history.log an.

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, genau zu verdeutlichen, was ich von Hand installiert habe. Setzen Sie ein -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 annimmt oder nicht. Es scheint nicht die Installation von der Ubuntu Software Desktop App zu übernehmen.

    
s1037989 04.02.2017 19:48
quelle
8

Das folgende Skript wird alle Pakete ausgeben, 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.

    
txwikinger 16.08.2010 21:42
quelle
5

Wie mehrere Leute bemerkt haben, scheint apt-mark showmanual ein bisschen buggy zu sein (und ich habe 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 das eine sehr kurze Liste von 5 Artikeln, die auch nicht genau zu sein scheint.

    
cluelesscoder 27.10.2013 01:28
quelle
4

Um eine Liste aller Pakete zu erhalten (nicht installiert, vom Benutzer installiert oder standardmäßig über alle PPAs installiert), verwendet apt 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 ungefähr 50.000 +)

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

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 zusätzliche Informationen zu ihnen zu erhalten, wie z. B. unterstützte Version und Architektur (x86, x86_64, amd64, all, etc.)

    
Aalok 07.02.2017 15:01
quelle
2

Nachdem ich viel gegoogelt habe, habe ich es geschafft, dieses Skript zusammenzustellen. Es geht mir gut:

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

    echo "# $desc"
    echo "# $date"
    echo "sudo apt-get install $pack"
    echo -e ""
done
    
dufferZafar 31.05.2015 22:28
quelle
1

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

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 eher ein Beispiel dafür, wie cool du aussiehst, wenn du deinen Freunden massive Bash-Befehle baust.

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, die tatsächlich installiert sind (nicht nur die restliche Konfiguration)
  • Wir hacken den Status
  • ab
  • Wir vergleichen diese Liste mit der automatisierten Liste von apt-mark
  • Wir rocken, weil wir können.
Oli 16.08.2010 19:41
quelle
1

Wenn niemand Ihnen eine nette Antwort mit einem Befehl apr-something gibt, können Sie es auf harten Weg tun . 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 wahrscheinlich funktionieren, wenn Dateiplatzierungsänderungen angezeigt werden. Ich behalte meine für den Fall, dass die Information über den Speicherort der Datei nützlich ist.

    
Javier Rivera 16.08.2010 19:44
quelle
0

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

  1. Öffnen Sie 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.

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

    
blueray 28.05.2018 17:39
quelle
-1

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

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.* " |
  sed -r "s/Commandline: apt-get//;s/ //" |
  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 08.10.2014 15:39
quelle