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ą.

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.


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)'

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

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.


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.


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\*

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"

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.


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>

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.


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

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

Ł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

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


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).


Skopiowałem z mojej odpowiedzi gdzie indziej.
— pbhj
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.