Ich möchte eine Liste der manuell installierten Pakete von apt
oder erhalten aptitude
und herausfinden, ob ein foobar
Paket manuell oder automatisch installiert wurde. Gibt es eine gute Möglichkeit, dies von der Kommandozeile aus zu tun?
Ich möchte eine Liste der manuell installierten Pakete von apt
oder erhalten aptitude
und herausfinden, ob ein foobar
Paket manuell oder automatisch installiert wurde. Gibt es eine gute Möglichkeit, dies von der Kommandozeile aus zu tun?
Antworten:
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:
sed
Leerzeichen am Ende der Zeile.Andere Möglichkeiten funktionieren nicht so gut:
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.apt-mark showauto
anstelle von /var/log/installer/initial-status.gz
. apt-mark
Beispiel: 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).
/var/log/installer/initial-status.gz
es fehlt. Auch ich möchte wissen, ob dies abhängig von der APTS-Kennzeichnung ist manual
oder nicht?
showmanual
Befehl ausgeführt (siehe unten). Und verwenden Sie comm
, um die beiden (sortierten) Listen zu vergleichen. Das showmanual
Ergebnis 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 comm
Befehls 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.
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;)]
In neueren Versionen des Pakets apt gibt es auch den Befehl apt-mark
apt-mark showmanual
linux-image-3.11.0-*-generic
usw. als Handbuch zu betrachten
linux-image-3.13.0-24-generic
ist manuell, aber der Strom linux-image-3.13.0-27-generic
ist automatisch. Es scheint, dass bei einem Upgrade eines Referenzpakets (in diesem Fall linux-image-generic
das die Abhängigkeiten änderte) die manuelle Markierung automatisch gesetzt wird
apt-get autoremove
. Das ist definitiv nicht was Sie wollen.
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 1
Hä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 aptitude
oder nicht. Es scheint keine Installationen von der Ubuntu-Software-Desktop-App aufzunehmen.
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.
aptitude search
zeigt ALLE Pakete, nicht nur die, die manuell installiert wurden (ich nehme an, dass dies das ist, was das OP wollte)
aptitude search '!~M ~i'
und es werden 1043 Pakete aufgelistet. Ich habe auf keinen Fall so viele Pakete manuell installiert.
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.
sys.exit(1)
without import sys
kann in neueren Versionen von Python zu einem Fehler führen. Entweder import sys
oder verwenden exit(1)
.
Um eine Liste aller Pakete (nicht installiert, vom Benutzer installiert oder standardmäßig installiert, über alle PPAs hinweg) abzurufen, apt
verwenden 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-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 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.)
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.
sys.exit(1)
without import sys
kann in neueren Versionen von Python zu einem Fehler führen. Entweder import sys
oder verwenden exit(1)
.
Ich möchte eine GUI-Lösung geben.
Öffnen Synaptic Package Manager
Gehe zu Status
Klicken Installed (manual)
Es wird die Liste der manuell von apt oder aptitude installierten Pakete angezeigt.
Leider konnte ich keine Option Custom Filters
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 darunter Installed (manual)
ist, wurde es manuell installiert.
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.
apt-get install liferea
und 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 0
statt eines 1
. Außerdem sollten Sie Ihr Regex-Muster auf " foobar$"
anstatt auf nur ändern foobar
.
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
sort -u
anstelle von verwenden sort | unique
. Da apt-mark
die 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.
apt-mark
möglicherweise wird die Architektur für einige Pakete angezeigt, jedoch nicht für so viele dpkg -l
.
apt-cache search
ist langsam. Das Abrufen einer Liste der installierten Daten im Voraus mithilfe von help.ubuntu.com/community/ListInstalledPackagesByDate ist möglicherweise effizienter
Wie Li Lo sagte, apt-mark showauto
sollte 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?
apt-mark
comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)
ist richtig besser;)
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
}