Jak znaleźć ręcznie zainstalowane pakiety?

48

Zainstalowałem zwykły Ubuntu 10.10 na swoim komputerze i zainstalowałem trochę oprogramowania przez apt-get. W zeszłym tygodniu udało mi się wszystko zepsuć i zacząłem od zera i muszę ponownie zainstalować oprogramowanie. Czy jest jakiś sposób na utworzenie listy ze wszystkimi pakietami, które zainstalowałem ręcznie?

Czyli da mi listę podobną texlive, ...do tej, texlive, texlive-dep1, textlive-dep2, ...a wszystkie standardowe pakiety zostały usunięte?

Gdybym mógł jakoś dowiedzieć się, które programy ze zwykłej instalacji usunąłem, byłoby to również niesamowite!


Aktualizacja 2015-05-23: Teraz używam Ansible jako zarządzania konfiguracją w moich systemach. Tam określam pakiety do zainstalowania. Służy to celowi, jeszcze bardziej instalując wszystkie programy w świeżym systemie. Więc to pytanie może być wstępem do lekkiego zarządzania konfiguracją.

Martin Ueding
źródło

Odpowiedzi:

24

Z tą sugestią zakładam, że twoja stara instalacja nadal się uruchamia!

Aby powielić jeden zestaw pakietów na innym komputerze:

W systemie A uruchom:

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

Przenieś my-selectionsplik do systemu B.

W systemie B uruchom:

dpkg --set-selections < my-selections

i wtedy:

sudo apt-get dselect-upgrade

Ważna uwaga: jeśli zainstalowałeś pakiety z niestandardowych repozytoriów i / lub PPA, będziesz również chciał skopiować /etc/apt/sources.listi zawartość /etc/apt/sources.list.d/z Systemu A do Systemu B przed uruchomieniem aktualizacji.

Możesz użyć, dpkgaby zobaczyć również to, co usunąłeś (Uwaga: obejmie to również pakiety, które ręcznie zainstalowałeś i usunąłeś):

dpkg --get-selections | grep deinstall

Możesz zobaczyć swoje wyniki w terminalu lub, oczywiście, przekierować do pliku.

Mark Russell
źródło
9
Chciałbym uzyskać listę wszystkich pakietów, ale chciałbym mieć tylko nazwy pakietów, które jawnie zainstalowałem. Tak po prostu somethingi nie something-commontak dobrze.
Martin Ueding,
6
Tak, chociaż jest to przydatne, nie robi tego, o co pyta pytanie.
Timmmm,
3
Jeśli to zrobisz, automatycznie zainstalowane zależności nigdy nie zostaną wyczyszczone po usunięciu programów. Dlaczego ludzie głosują za odpowiedzią, która odpowiada dokładnie temu, czego pytający specjalnie nie chciał?
jbo5112
20

Ten wątek z superuser.com daje to rozwiązanie:

aptitude search '?installed ?not(?automatic)'
Jason
źródło
2
To mi nie działa. Po prostu wymienia wszystko, co jest zainstalowane, a na pewno więcej niż o to wyraźnie prosiłem.
Timmmm,
Zawiera listę wszystkiego, co zostało zainstalowane apt-get, a także ich zależności. Na przykład, jeśli zainstalowałeś aptitude, wyświetli się równieżapt-xapian-index aptitude-common libboost-iostreams1.54.0 libclass-accessor-perl libcwidget3 libept1.4.12 libio-string-perl libparse-debianchangelog-perl libsigc++-2.0-0c2a libsub-name-perl libtimedate-perl libxapian22 python-chardet python-debian python-six python-xapian
Runemoro
10

Jeśli twoje dzienniki apt znajdują się w / var / log / apt, coś takiego powinno działać:

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

Lub jeśli chcesz pozbyć się powtarzających się śmieci w danych wyjściowych:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install" \
  | cut -f4- -d" " | sort | uniq
Mzzzzzz
źródło
6

Możesz użyć apt-mark , ale polecam debfoster :

sudo apt-get install debfoster
sudo debfoster

Spowoduje to sprawdzenie wszystkich zainstalowanych pakietów i ustalenie, które z nich utrzymują pozostałe:

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:

Kiedy odpowiesz „y” na każde pytanie (po prostu wciśnij Enter, aby przejść szybko), debfoster zbierze listę pakietów i zapisze je wiersz po wierszu do pliku. Domyślnie jest to /var/lib/debfoster/keepers. To wygląda tak:

gnome-do
texlive-full
...

Konfiguruję debfoster poprzez, /etc/debfoster.confaby umieścić tę listę /etc/debfoster-keepersi śledzić plik za pomocą etckeeper, aby zachować historię i kopie zapasowe. Odpowiedź tutaj pokazuje jak zainstalować listę pakietów z pliku tekstowego nowej linii oddzielonych:

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

Zwróć uwagę na ograniczenie w tym, że pakiety, które zostały usunięte, mają przed sobą znak „-”. Więc chcesz usunąć te linie przed wywołaniem apt-mark.

Chociaż strona internetowa debfostera mówi, że debfoster jest przestarzały na korzyść aptitude, wolę szybką i prostą konfigurację debfostera. Umieszcza cię w środku bazy danych pakietów i pozwala ci posprzątać, dzięki czemu pakiety automatyczne i ręczne stają się bardziej oczywiste.

Wpisz „h” w wierszu debfoster, aby wyjaśnić opcje. Rodzaj "?" aby zobaczyć opis pakietu. How-to tutaj może być przydatna.

rduplain
źródło
5
comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Daje wszystkie ręcznie zainstalowane pakiety (nie pakiety systemowe, nie zależności). Na przykład pokazuje, build-essentialale nie gcc.

ecerulm
źródło
3

Dla tych, którzy wolą używać narzędzi apt- *, jest narzędzie apt-mark, które pozwala zarówno na zapytania, jak i modyfikowanie stanu ręcznego / automatycznego.

apt-mark showmanual

Możesz także określić wzór dla pakietów, które Cię interesują:

apt-mark showmanual qemu\*
Alexander Koptelov
źródło
To jest bilet.
John Von Neumann,
2

W końcu mam to teraz:

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"
Martin Ueding
źródło
2
Wydaje mi się, że działa to tylko wtedy, gdy instalowałeś tylko pakiety przy użyciu aptitude. Istnieją jednak podobne pliki /var/log/apt/history.log(.N.gz).
Timmmm,
Możesz użyć zgrepzamiast gunziplub zcatdo potoku grep. Wierzę, że jest to skrypt otoki dostarczany z gzip. Akceptuje również pliki nieskompresowane, dzięki czemu można uprościć skryptzgrep -E '(\[INSTALLIEREN\]|\[INSTALL\])' /var/log/aptitude* | awk '{ print $2 }'
Steve Buzonas
2

Jestem w stanie wyciągnąć wszystko, otwierając pliki dziennika w / var / log / apt /

Następnie wchodzę i ręcznie odfiltrowuję pakiety instalacyjne apt-get. Może istnieć sposób na zrobienie tego programowo, ale nie jestem tego świadomy.

marty331
źródło
1
cd /var/log/apt
cat  history.log | grep Commandline

w ten sposób zobaczysz listę poleceń wykonanych w przeszłości.

Usuń kod grep, jeśli potrzebujesz więcej informacji:

less history.log

jeśli dziennik jest skompresowany (tzn. kończy się na gz)

gunzip <filename>

aby go ponownie skompresować po zakończeniu, możesz:

gzip <filename>
Zen
źródło
1
Zamiast dekompresować i ponownie kompresować pliki dziennika, dlaczego nie użyć zcat? To jest tak proste jak zcat filename.gz. Można go użyć zamiast skompresowanych plików gzip cat. Również grepmożna zastąpić zgrepnp zgrep Commandline history.log.1.gz.
lgarzo
Na podstawie swojego pomysłu Doszedłem z linii komend: (grep "Commandline" history.log ; zgrep "Commandline" history.log.*.gz ) | grep " install " | grep -v -- "--yes" | sed -r "s/^.*install //". Ma wady, ponieważ usunięte pakiety są również wymienione, a jeśli pakiet został zainstalowany więcej niż raz, jest wymieniony wiele razy.
lgarzo
1

Nie widziałem, żeby jakieś rozwiązania działały dla mnie, zainstalowałem sporo pakietów deb z dpkg i brakowało kilku elementów, których szczególnie szukałem.

Dość długa jedna wkładka, ale wygodna do skopiowania i wklejenia to:

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

Powyższe polecenie zapisuje listę pakietów do pliku w bieżącym katalogu roboczym o nazwie my-packages.

Wyjaśnienie

Najpierw zbudowałem listę pakietów, które stanowiły linię bazową pakietów wybranych podczas instalacji.

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

Następnie znajduje się długa lista elementów zainstalowanych ogólnie.

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

Następnie porównałem oba pliki initiali installedwymieniłem tylko te elementy, które nie były zainstalowane.

comm -23 installed initial > custom

Stamtąd chciałem odfiltrować zależności, tutaj ta metoda może ominąć niektóre pożądane pakiety, nie jest świadoma zależności, które są również jawnie zainstalowane.

Napisałem funkcję szybkiego bashu, aby skrócić te kroki w przetwarzaniu tych elementów.

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

Następnie przekazałem każdą linię z mojego pliku customdo tej funkcji za pomocą xargs.

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

Kiedy miałem długą listę wszystkich możliwych zależności (nie jestem pewien co do każdej możliwej instrukcji), ponownie otrzymałem wiersze, które były unikalne dla jednego pliku.

comm -23 custom deps > manual

A moja skończona lista pakietów znajduje się teraz w pliku o nazwie manualdostępnej do przejrzenia.

Steve Buzonas
źródło
0

Ktoś powiązany z https://unix.stackexchange.com/questions/3595/ubuntu-list-explicitly-installed-packages/3624#3624, który ma dobre rozwiązanie, ale nie zachowuje się poprawnie jak wyjście z aptitude zmienił się. Oto zaktualizowana wersja oparta na porównaniu aktualnie zainstalowanych pakietów w porównaniu do 12,04 LTS. Będziesz musiał aptitudezainstalować, to jedyny wymóg.

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

Aby rozbić powyższe polecenie na części, ten bit wyprowadza jeden pakiet na linię wszystkiego zainstalowanego w systemie

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

Spowoduje to pobranie domyślnej listy pakietów i wycięcie zbędnych informacji.

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

i commporównuje dwa pliki i wyprowadza pakiety, których nie ma na domyślnej liście.

comm -23 currentlyinstalled defaultinstalled
johndrinkwater
źródło
Możesz także przejść do innej witryny i tam zaktualizować odpowiedź.
Martin Ueding
0

Użyj pliku manifestu dystrybucji jako podstawowego zestawu pakietów. Sortuj ręcznie zainstalowane wyniki według grup pakietów według architektury i sekcji, dzięki czemu łatwiej jest skupić się na grupach pakietów (być może nie obchodzą Cię niektóre sekcje).

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
Darren Weber
źródło
Łatwo byłoby zmodyfikować pliki pakietu, więc każda linia ma prefiks, apt-get install -y a plik jest skryptem bash. Wówczas wszystkie pliki pakietu mogłyby zostać włączone do błędnej pętli udostępniania.
Darren Weber
0
#! /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
Hir0
źródło
0

Nie znalazłem takiego, który byłby dla mnie odpowiedni, więc napisałem scenariusz. Analizując zawartość /var/log/apt/history.log* i / var / log / aptitude, a następnie sortuj według datetime, w wyniku czego powstają dwie listy, jedna jest ręcznie instalowana pkgs, druga jest instalowana, ale usunięta pkgs. Skrypt z weryfikacją „apt list”. małe odchylenie, ponieważ użycie zainstalowanego i zmodyfikowanego źródła PPA dpkg.

Tutaj umieszczam https://github.com/eexpress/eexp-bin/blob/master/self-installed-pkg.pl .

jeśli ktoś potrzebuje go przetestować, może potrzebuję zmodyfikować kod, ponieważ moje pliki dziennika są mieszane w języku chińskim i angielskim (szczególnie w formacie datetime RFC2822), muszę się z tym pogodzić. wprowadź opis zdjęcia tutaj

utopic eexpress
źródło
Co to za nieczytelny zrzut ekranu z tekstem?
muru
To jest mój wynik skryptu. Ale dzisiaj uważam, że dnf z Fedory jest bardziej efektywny. „Historia dnf” pokazuje czystą historię działania pakietów.
utopic eexpress
0

Myślę, że chcesz użyć /var/log/apt/history.logi jego przyjaciół, aby wprowadzić zmiany, które zostały wprowadzone:

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

(Zmodyfikowane ze źródła )

Daje ci wszystkie pakiety, które zostały zainstalowane w wierszu poleceń za pomocą odmiany apt-get install.

Pobiera spakowane pliki ze starego history.logs dodaje je z bieżącym history.logi przechodzi przez grep, wyodrębniając wiersze za pomocą apt [-get] zainstaluj [i / lub zainstaluj ponownie] i pokazując resztę linii (flaga -o), co stanowi nazwy pakietów.

Będzie to wymagać trochę modyfikacji (np. Za pomocą sed), jeśli chcesz tylko nazwy pakietów w osobnych wierszach; ćwiczenie dla czytelnika!

Warto zauważyć, że menedżer pakietów synaptycznych ( gksu synapticlub kdesudo synaptic) w sekcji „status” ma listę „zainstalowanych (ręcznie)”. Jeśli zaznaczysz całą listę do usunięcia [nie stosuj jej !!], powinieneś być w stanie zapisać zaznaczone zmiany i uzyskać listę pakietów w ten sposób. Uwaga: to synapticdla mnie zablokowane (prawdopodobnie obliczanie usunięć zależności).

pbhj
źródło
Skopiowałem z mojej odpowiedzi gdzie indziej.
pbhj