it-swarm.com.de

Wie finde ich manuell installierte Pakete?

Ich habe ein einfaches Ubuntu 10.10 auf meinem Computer installiert und Software über apt-get installiert. Letzte Woche habe ich es geschafft, alles zu brechen und habe gerade von vorne begonnen, und ich muss meine Software neu installieren. Gibt es eine Möglichkeit, eine Liste mit allen Paketen zu erstellen, die ich manuell installiert habe?

Damit es mir eine Liste wie texlive, ... und nicht texlive, texlive-dep1, textlive-dep2, ... gibt und alle Standardpakete entfernt werden?

Wenn ich irgendwie herausfinden könnte, welche Programme aus der regulären Installation ich entfernt habe, wäre das auch fantastisch!


Update 23.05.2015: Ich verwende jetzt Ansible als Konfigurationsmanagement auf meinen Systemen. Dort gebe ich die zu installierenden Pakete an. Dies dient dem Ziel, alle Programme auf einem neuen System zu installieren, noch besser. Diese Frage könnte also der Einstieg in ein leichtes Konfigurationsmanagement sein.

49
Martin Ueding

Ich habe es jetzt endlich verstanden:

outfile="$(mktemp)"
pattern='(\[INSTALLIEREN\]|\[INSTALL\])'

if [[ -f "/var/log/aptitude.1.gz" ]]
then
        gunzip -c /var/log/aptitude.*.gz | grep -E "$pattern" | awk '{ print $2; }' > "$outfile"
fi

if [[ -f "/var/log/aptitude" ]]
then
        grep -E "$pattern" "/var/log/aptitude" | awk '{ print $2; }' >> "$outfile"
fi

sort "$outfile"
rm "$outfile"
2
Martin Ueding

Mit diesem Vorschlag gehe ich davon aus, dass Ihre alte Installation noch startet!

So replizieren Sie einen Paketsatz auf einem anderen Computer:

Führen Sie auf System A Folgendes aus:

dpkg --get-selections | grep -v deinstall > my-selections

Verschieben Sie die Datei my-selections auf System B.

Führen Sie auf System B Folgendes aus:

dpkg --set-selections < my-selections

und dann:

Sudo apt-get dselect-upgrade

Wichtiger Hinweis: Wenn Sie Pakete aus nicht standardmäßigen Repositorys und/oder PPAs installiert haben, möchten Sie auch /etc/apt/sources.list und den Inhalt von /etc/apt/sources.list.d/ von System A nach System B kopieren, bevor Sie das Upgrade ausführen.

Sie können dpkg verwenden, um zu sehen, was Sie ebenfalls entfernt haben (Hinweis: Dies schließt auch manuell installierte Pakete ein nd entfernt):

dpkg --get-selections | grep deinstall

Sie können Ihre Ergebnisse im Terminal anzeigen oder natürlich in eine Datei umleiten.

26
Mark Russell

Dieser Thread von superuser.com gibt diese Lösung:

aptitude search '?installed ?not(?automatic)'
20
Jason

Wenn sich Ihre apt-Protokolle in/var/log/apt befinden, sollte Folgendes funktionieren:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install"

Oder wenn Sie den sich wiederholenden Müll in der Ausgabe loswerden möchten:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install" \
  | cut -f4- -d" " | sort | uniq
10
Mzzzzzz

Sie könnten apt-mark verwenden, aber ich empfehle debfoster :

Sudo apt-get install debfoster
Sudo debfoster

Dadurch werden alle installierten Pakete überprüft und herausgefunden, auf welchen die anderen installiert bleiben:

texlive-full is keeping the following 161 packages installed:
  cm-super cm-super-minimal context doc-base dvipng feynmf
  fonts-gfs-artemisia fonts-gfs-baskerville fonts-gfs-bodoni-classic
  ...
Keep texlive-full? [Ynpsiuqx?], [H]elp:

Wenn Sie jede Frage mit "y" beantworten (drücken Sie einfach die Eingabetaste, um sich schnell zu bewegen), sammelt debfoster die Paketliste und schreibt sie zeilenweise in eine Datei. Standardmäßig ist dies bei /var/lib/debfoster/keepers. Es sieht aus wie das:

gnome-do
texlive-full
...

Ich konfiguriere debfoster über /etc/debfoster.conf, um diese Liste auf /etc/debfoster-keepers zu setzen, und verfolge die Datei mit etckeeper , um Verlauf und Backups zu führen. Das hier antworten zeigt, wie eine Liste von Paketen aus einer durch Zeilenumbrüche getrennten Textdatei installiert wird:

Sudo apt-mark manual $(cat debfoster-keepers)

Beachten Sie hier eine Einschränkung, Pakete, die Sie gelöscht haben, haben ein '-' vor sich. Sie möchten also diese Zeilen entfernen, bevor Sie apt-mark aufrufen.

Obwohl die debfoster's website besagt, dass debfoster zugunsten von aptitude veraltet ist, bevorzuge ich die Prompt und einfache Konfiguration von debfoster. Es versetzt Sie in die Mitte Ihrer Paketdatenbank und ermöglicht es Ihnen, Dinge aufzuräumen, indem Sie das automatische und manuelle Pakete deutlicher.

Geben Sie "h" an der Debfoster-Eingabeaufforderung ein, um Ihre Optionen zu erläutern. Art "?" um die Paketbeschreibung zu sehen. Das how-to here könnte nützlich sein.

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

Gibt alle manuell installierten Pakete an (keine Systempakete, keine Abhängigkeiten). Zum Beispiel wird build-essential aber nicht gcc angezeigt.

5
ecerulm

Für diejenigen, die apt- * tools bevorzugen, gibt es ein apt-mark-Dienstprogramm, mit dem man den manuellen/automatischen Status abfragen und ändern kann.

apt-mark showmanual

Sie können auch Muster für Pakete angeben, an denen Sie interessiert sind:

apt-mark showmanual qemu\*
3

Ich kann alles abrufen, indem ich die Protokolldateien in/var/log/apt/öffne.

Ich gehe dann hinein und filtere die apt-get install-Pakete manuell heraus. Es kann einen Weg geben, dies programmatisch zu tun, aber ich bin mir dessen nicht bewusst.

2
marty331
cd /var/log/apt
cat  history.log | grep Commandline

auf diese Weise sehen Sie die Liste der in der Vergangenheit ausgeführten Befehle.

Entfernen Sie den Grep-Code, wenn Sie weitere Informationen benötigen:

less history.log

wenn das Protokoll komprimiert ist (d. h. mit gz enden)

gunzip <filename>

wenn Sie fertig sind, können Sie es erneut komprimieren:

gzip <filename>
1
Zen

Ich habe hier keine Lösung für mich gesehen, ich habe einige Deb-Pakete mit dpkg installiert und einige der Dinge, nach denen ich besonders gesucht habe, fehlten.

Ein ziemlich langer Einzeiler, der sich aber bequem kopieren und einfügen lässt, wäre:

export DPKG_INITIAL=$(mktemp) DPKG_INSTALLED=$(mktemp) DPKG_CUSTOM=$(mktemp) DPKG_DEPS=$(mktemp) zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > $DPKG_INITIAL ; awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > $DPKG_INSTALLED ; comm -23 installed initial > $DPKG_CUSTOM ; function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; } ; echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > $DPKG_DEPS ; comm -23 custom deps > my-packages ; rm $DPKG_INITIAL $DPKG_INSTALLED $DPKG_CUSTOM $DPKG_DEPS

Der obige Befehl speichert eine Liste von Paketen in einer Datei in Ihrem aktuellen Arbeitsverzeichnis mit dem Namen my-packages.

Erläuterung

Ich habe zuerst eine Liste von Paketen erstellt, die die Grundlinie der während der Installation ausgewählten Pakete bilden.

zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print $2 }' > initial

Gefolgt von einer langen Liste von Elementen, die im Allgemeinen installiert sind.

awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > installed

Ich habe dann die beiden Dateien initial und installed verglichen, um nur die Elemente aufzulisten, die für die Installation eindeutig sind.

comm -23 installed initial > custom

Von dort wollte ich die Abhängigkeiten herausfiltern, hier kann es vorkommen, dass bei dieser Methode einige gewünschte Pakete fehlen, es sind keine Abhängigkeiten bekannt, die auch explizit installiert werden.

Ich habe eine schnelle Bash-Funktion geschrieben, um diese Schritte bei der Verarbeitung dieser Elemente zu verkürzen.

function rdep() { apt-cache rdepends $1 | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }

Danach habe ich jede Zeile aus meiner Datei custom mit xargs in diese Funktion übergeben.

echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > deps

Sobald ich die lange Liste aller möglichen Abhängigkeiten hatte (nicht sicher bei jeder möglichen Anweisung), bekam ich wieder die Zeilen, die für eine einzelne Datei eindeutig waren.

comm -23 custom deps > manual

Und meine fertige Paketliste befindet sich jetzt in einer Datei mit dem Namen manual, die ich überprüfen kann.

1
Steve Buzonas

Ich habe kein passendes für mich gefunden, also habe ich ein Drehbuch geschrieben. Durch Analyse des Inhalts von /var/log/apt/history.log* und/var/log/aptitude und anschließende Sortierung nach Datum und Uhrzeit werden zwei Listen erstellt. Eine Liste enthält manuell installierte und eine installierte, aber entfernte. Skript mit Bestätigung der 'Apt-Liste'. eine kleine abweichung, weil die verwendung von dpkg die ppa quelle installiert und modifiziert.

Ich füge hier https://github.com/eexpress/eexp-bin/blob/master/self-installed-pkg.pl .

wenn jemand es testen muss, möglicherweise Code ändern muss, da meine Protokolldateien in Chinesisch und Englisch (insbesondere RFC2822-Datum/Uhrzeit-Format) gemischt sind, muss ich damit umgehen. enter image description here

0
utopic eexpress

Verwenden Sie eine Verteilungsmanifestdatei als Basispaket. Sortieren Sie die manuell installierten Ergebnisse nach Architektur und Abschnitt in Paketgruppen, damit Sie sich leichter auf Gruppen von Paketen konzentrieren können (möglicherweise interessieren Sie sich nicht für einige Abschnitte).

https://Gist.github.com/darrenleeweber/8cc570ff402f19af7fa4

#!/bin/bash

manifest_url='http://releases.ubuntu.com/releases/trusty/ubuntu-14.04.3-desktop-AMD64.manifest'
manifest_file=$(echo $manifest_url | sed -e 's#.*/##g')
if [ ! -e $manifest_file ]; then
    wget -q $manifest_url
fi
cat $manifest_file | cut -f1 | sort -u > default_installed.txt

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

comm -23 currently_installed.txt default_installed.txt > manually_installed.txt

# sort the 'mannually_installed.txt' packages by architecture and section
mkdir -p package_files
while read p; do
    apt-cache show $p > info.txt
    Arch=$(grep -m1 'Architecture: ' info.txt | sed -e 's/Architecture: //')
    section=$(grep -m1 'Section: ' info.txt | sed -e 's/Section: //' -e 's/\//_/g')
    file="${Arch}_${section}_packages.txt"
    echo $p >> "package_files/$file"
done <manually_installed.txt

rm info.txt
0
Darren Weber
#! /bin/sh
DEFAULT=`tempfile`
CURRENT=`tempfile`
cat /var/log/installer/initial-status.gz | gzip -d | grep '^Package:' | awk '{ print $2}' | sort -u > $DEFAULT
aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' | awk '{ print $1}' > $CURRENT
comm -23 $CURRENT $DEFAULT
rm $DEFAULT
rm $CURRENT
0
Hir0

Jemand verlinkt mit https://unix.stackexchange.com/questions/3595/ubuntu-list-explicitly-installed-packages/3624#3624 was eine gute Lösung hat, aber nicht Verhalten Sie sich korrekt, da sich die Ausgabe von aptitude geändert hat. Hier ist eine aktualisierte Version, basierend auf den aktuell installierten Paketen im Vergleich zu 12.04 LTS. Sie müssen aptitude installiert haben, dies ist die einzige Voraussetzung.

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled && wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-AMD64.manifest | cut -f 1 | sort -u > defaultinstalled && comm -23 currentlyinstalled defaultinstalled

Um den obigen Befehl in Teile zu zerlegen, gibt dieses Bit ein Paket pro Zeile von allem aus, was auf dem System installiert ist

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled

Dadurch wird die Standardpaketliste heruntergeladen und die redundanten Informationen werden abgeschnitten.

wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-AMD64.manifest | cut -f 1 | sort -u > defaultinstalled

und comm vergleicht die beiden Dateien und gibt die Pakete aus, die nicht in der Standardliste enthalten sind.

comm -23 currentlyinstalled defaultinstalled
0
johndrinkwater

Ich denke, Sie möchten /var/log/apt/history.log und seine Freunde verwenden, um die vorgenommenen Änderungen vorzunehmen:

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt(?:-get)? install (?!.*--reinstall)\K.*'

(Geändert von Quelle )

Gibt Ihnen alle Pakete, die in der Befehlszeile mit einer Variation von apt-get install installiert wurden.

Die komprimierten Dateien in den alten history.logs werden mit dem aktuellen history.log hinzugefügt und durchlaufen grep, wobei Zeilen mit apt [-get] install [und/oder restart] extrahiert werden und der Rest der Zeile angezeigt wird (-o Flag), das den Paketnamen angibt.

Dies erfordert eine kleine Modifizierung (z. B. mit sed), wenn Sie nur die Paketnamen in separaten Zeilen verwenden möchten. eine Übung für den Leser!

Es ist erwähnenswert, dass der Synaptic Package Manager (gksu synaptic oder kdesudo synaptic) im Abschnitt "Status" eine Liste "Installiert (Manuell)" enthält. Wenn Sie die gesamte Liste zum Entfernen markieren [nicht anwenden !!], sollten Sie in der Lage sein, die markierten Änderungen zu speichern und auf diese Weise eine Liste der Pakete zu erhalten. Achtung: Das hat synaptic für mich gesperrt (Berechnung der Abhängigkeitsentfernungen vermutlich).

0
pbhj