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



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.


8

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)

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


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

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 .


-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

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