Jak uzyskać historię „apt-get install” na Ubuntu?

85

Mam zamiar przenieść serwer z jednego systemu Ubuntu na inny. Nie klonuję starego pudełka na nowe; Tworzę nowy system i będę przenosić dane w razie potrzeby. Chcę zainstalować całe oprogramowanie, które mam na starym pudełku na nowym.

Czy istnieje prosty sposób na znalezienie historii wszystkich poleceń „sudo apt-get install”, które wydałem w miarę upływu czasu? Oznacza to, że dpkg -l pokazuje mi wszystkie zainstalowane pakiety, ale nie pokazuje, który pakiet najwyższego poziomu je zainstalował. Jeśli istnieje sposób, aby dpkg dał mi pakiet instalacyjny, mogę tam znaleźć te unikalne; w przeciwnym razie chcę powiedzieć coś innego: „zainstalowałeś te 24 pakiety”.

Paul Hoffman
źródło
Czy możesz zaakceptować odpowiedź poniżej? Być wdzięcznym ludziom, którzy odpowiedzieli.
m-ric
Te rozwiązania sprawdzą tylko, co się stało PO ostatnim obrocie dziennika. Nie sprawdzają całej historii.
Kraang Prime
Prosta i szybka metoda została podana w tej odpowiedzi, askubuntu.com/a/250530/197730 , na to pytanie Jak wyświetlić listę wszystkich zainstalowanych pakietów .
TooTone

Odpowiedzi:

68

aptHistoria jest /var/log/apt/history.logjak powiedział w komentarzu powyżej. To powiedziawszy, nie będzie zawierało listy pakietów, które zostały zainstalowane ręcznie, za pomocą dpkglub GUI, takich jak gdebi. Aby zobaczyć wszystkie paczki, które przeszły dpkg, możesz spojrzeć na /var/log/dpkg.log.

Inkaphink
źródło
8

http://www.debianadmin.com/clone-your-ubuntu-installation.html

i /var/adm/apt/history.log

M_1
źródło
5
Procedura w pierwszym łączu nie rozróżnia pakietów instalowanych automatycznie od pakietów instalowanych ręcznie. /var/log/apt/history.log(Twoja lokalizacja jest błędna), po kilku miesiącach zmieni się.
Gilles
Gilles ma rację w obu kwestiach. Mam tylko te dzienniki o wartości około miesiąca i nawet nie widzę, jak ustawiony jest wskaźnik usuwania dzienników (odbywa się to za pomocą „newsyslog” na FreeBSD). Więc nadal nie mam rozwiązania, ale mam kilka wskazówek. Mogę przynajmniej grepować dane wyjściowe polecenia w artykule do klonowania, szukać nazw „wysokiego poziomu”, instalować je na nowym, robić to samo na nowym pudełku, różnicować oba wyniki i powtarzać do momentu spełnienia. Nadal chciałbym usłyszeć więcej pomysłów.
Paul Hoffman
7

Możesz wyświetlić listę pakietów, których instalacja została wyraźnie zażądana apt-mark.

apt-mark showmanual

Jeśli używasz starożytnej wersji Debiana, oto instrukcja.

Poniższe polecenie podaje listę pakietów, których instalacji zażądano, ręcznie lub automatycznie. Jeśli nie jesteś w trakcie (de) instalowania pakietów, jest to lista zainstalowanych pakietów.

dpkg --get-selections | sed -n 's/\t\+install$//p'

Następujące polecenie daje nadzbiór automatycznie instalowanych pakietów:

</var/lib/apt/extended_states awk -v RS= '/\nAuto-Installed: *1/{print$2}'

Podsumowując, następujące polecenie wyświetla ręcznie zainstalowane pakiety:

comm -23 <(dpkg --get-selections | sed -n 's/\t\+install$//p') \
         <(</var/lib/apt/extended_states \
           awk -v RS= '/\nAuto-Installed: *1/{print$2}' |sort)
Gilles
źródło
1
--- bardzo inny wynik odcomm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
Cbhihe
W Debianie istnieje apt-mark showmanualodpowiednik ostatniego polecenia.
maxschlepzig
3
grep -i "Commandline" /var/log/apt/history.log

Pokazuje wszystkie zainstalowane pakiety za pomocą: sudo apt-get install xxxxx

Prent Rodgers
źródło
Nie różni się to wystarczająco od odpowiedzi @ ℝaphink i powinno być komentarzem do niego.
Karl Richter,
2

Zamiast kombinacji tac / head lepiej jest użyć tail (dla ostatnich 25 linii):

tail -n 25 /var/log/apt/history.log
Liczba całkowita
źródło
Nie różni się to wystarczająco od odpowiedzi @ ℝaphink i powinno być komentarzem do niego.
Karl Richter,
Poza tym to nie to samo. tail wyświetli ostatnie wiersze w pliku, w kolejności, w jakiej znajdują się w pliku. tac odwróci kolejność, tak aby ostatnia linia była teraz pierwsza, druga do ostatniej jest druga itd. Również ponownie wydaje się, że ryzykujesz błąd, gdy mówisz, że coś jest „lepsze” bez wyjaśnienia dlaczego. Mam na myśli „lepiej” według kogo? Do jakich wymagań? Wydaje się trochę zbyt pewny siebie.
Todd Walton,
0

Inne odpowiedzi pomogły, ale dały mi za dużo wyników. Aby ograniczyć dane wyjściowe, zacząłem od apt-mark showmanualjak w tej odpowiedzi , a następnie odfiltrowałem pakiety pierwotnie zainstalowane (zobacz tę odpowiedź, aby uzyskać listę oryginalnie zainstalowanych pakietów; używam Ubuntu 18.04.2 stąd link poniżej) .

BASE_PACKAGES_MANIFEST=http://releases.ubuntu.com/18.04.2/ubuntu-18.04.2-desktop-amd64.manifest
REMOVE_VERSIONS_REGEX='[0-9][.-][0-9][.-][0-9]|[0-9][.-][0-9]|[0-9]'
paste  <( apt-mark showmanual ) <( apt-mark showmanual | sed -r "s/$REMOVE_VERSIONS_REGEX//g" ) |
    grep -vf <( curl $BASE_PACKAGES_MANIFEST | cut -f1 | sed -r "s/$REMOVE_VERSIONS_REGEX|:amd//g" ) |
    cut -f1 |
    sort |
    uniq

Skrypt odfiltrowuje pakiety, które były w oryginalnym manifeście, przeprowadzając porównanie niezależne od wersji, dzięki czemu uaktualnione pakiety nie pojawiają się na liście. Skończyło się na liście około 60 pakietów.

Innym sposobem podoba mi się ta odpowiedź, która przeszukuje wszystkie dzienniki apt .

TooTone
źródło
-1

Aby uzyskać listę najnowszych zainstalowanych pakietów w kolejności malejącej, lubię używać (np. 25 linii):

tac /var/log/apt/history.log |head --lines=25
Hartmut P.
źródło
1
Bardziej wydajna (i aliteracyjna) byłaby: tail -25 /var/log/apt/history.log | tac
agc
Nie różni się to wystarczająco od odpowiedzi @ ℝaphink i powinno być komentarzem do niego.
Karl Richter,