Jak mogę wyświetlić listę zainstalowanych pakietów według daty instalacji?
Muszę to zrobić na debian / ubuntu. Przydatne byłyby również odpowiedzi dla innych dystrybucji.
Zainstalowałem wiele rzeczy, aby skompilować pewien fragment kodu i chcę uzyskać listę pakietów, które musiałem zainstalować.
debian
package-management
apt
Elazar Leibovich
źródło
źródło
Odpowiedzi:
Dystrybucje oparte na RPM, takie jak Red Hat, są łatwe:
W Debianie i innych dystrybucjach opartych na dpkg twój specyficzny problem jest również łatwy:
Chyba że plik dziennika został obrócony, w takim przypadku powinieneś spróbować:
Ogólnie rzecz biorąc,
dpkg
iapt
nie wydaje się, aby śledzić datę instalacji, biorąc pod uwagę brak takiego pola nadpkg-query
stronie podręcznika .I w końcu stare
/var/log/dpkg.log.*
pliki zostaną usunięte przez rotację logów, więc nie ma gwarancji, że da Ci to całą historię twojego systemu.Jedną z sugestii, która pojawia się kilka razy (np. Ten wątek ) jest spojrzenie na
/var/lib/dpkg/info
katalog. Pliki tam sugerują, że możesz spróbować czegoś takiego:Aby odpowiedzieć na pytanie dotyczące wybranych opcji, oto pierwsze przejście.
buduj listę pakietów według dat
buduj listę zainstalowanych pakietów
dołącz do 2 list
Z jakiegoś powodu nie drukuje dla mnie zbyt wielu różnic, więc może istnieć błąd lub nieprawidłowe założenie dotyczące tego, co
--get-selections
oznacza.Możesz oczywiście ograniczyć pakiety za pomocą
find . -mtime -<days>
lubhead -n <lines>
i zmienić format wyjściowy, jak chcesz, npaby wyświetlić listę tylko tych opcji, które zostały zainstalowane (zmienione?) w ciągu ostatnich 4 dni.
Prawdopodobnie można również usunąć
sort
polecenia po sprawdzeniu kolejności sortowania używanej przezdpkg --get-selections
i zwiększyćfind
wydajność polecenia.źródło
apt-get
bardziej mi się podobarpm
, ale teraz debian dostaje -1 za nie zapisanie daty instalacji w bazie danych. Sztuczka debiana obejmuje wszystkie zainstalowane pakiety, nie tylko wybrane pakiety, ale to dobry początek.half-installed
wpisy), jeśli:grep install\ /var/log/dpkg.log
grep " install " /var/log/dpkg.log
wyświetla tylko linie „instaluj”, a nie pokazuje także „status”.Mikel pokazał, jak to zrobić na poziomie dpkg . W szczególności
/var/lib/dpkg/info/$packagename.list
jest tworzony, gdy pakiet jest instalowany (i nie jest później modyfikowany).Jeśli korzystałeś z narzędzi APT (co zapewne zrobiłeś, ponieważ martwisz się pakietami instalowanymi automatycznie lub ręcznie), jest historia
/var/log/apt/history.log
. Tak długo, jak się nie obraca, śledzi wszystkie instalacje, aktualizacje i usuwania APT, z adnotacją dla pakietów oznaczonych jako automatycznie zainstalowane. Jest to dość nowa funkcja, wprowadzona w APT 0.7.26, więc w Debianie pojawiła się w squeeze. W Ubuntu 10.04 ma,history.log
ale automatycznie zainstalowana adnotacja jest obecna do 10.10.źródło
Szorstki, ale działa:
źródło
ls
. Zobacz mywiki.wooledge.org/ParsingLs notatek na dlaczego jest to niebezpieczne / nieodłącznie buggy - bezpieczniejszym rozwiązaniem jest użycie albofind -printf
lubstat --format
do generowania strumienia, które mogą być jednoznacznie analizowany.ls -al --time-style=long-iso
powinno być pomocne. Ponadto prawdopodobnie nie jest znane, że ktoś nazwałby pakiet APT\n\t\r\v
nazwą./var/log/apt/history.log
Plik ma niewygodne formatu IMHO.Wolałbym bardziej sformatowany plik dziennika
lub niektóre XML pokazujące nie tylko {pakiet}, ale wszelkie {zależności}.
W chwili obecnej można odkryć poszukiwane informacje, ale wymaga to pewnych analiz kryminalistycznych w celu wyodrębnienia szczegółów.
źródło
Działa to dla mnie w systemie Debian, zgaduję, że format pliku zmienił się od 2011 roku. Ten system jest dość świeży, więc nie spodziewałbym się, że będzie działać na starszym systemie, chociaż może to wymagać jedynie rozpakowania dzienników i użycia glob odnosi się do nich wszystkich.
Pierwsze dwa pola w każdym wierszu pliku
/var/log/dpkg.log
to data i godzina. Zwróć uwagę na końcowe miejsce z instalacją w części grep, ponieważ aktualizacje mogą wyzwalać instalacje, ale jeśli dobrze zrozumiałem, chciałeś wiedzieć, co zainstalowali użytkownicy.źródło
Oto jedna linijka, której wszyscy chcą i potrzebują:
Wynik pokaże wszystkie (nowo) zainstalowane i zaktualizowane pakiety w kolejności chronologicznej.
Wyjaśnienie linii:
ls -1t
- pobierz wszystkiedpkg.log*
nazwy plików w kolejności chronologicznejzcat -f
- JEŚLI plik jest typu gzip, a następnie rozpakuj go, ELSE po prostu przekaże zawartość.tac
- Odwróć wyjście cat , linia po linii, aby upewnić się, że otrzymamy prawidłowy porządek chronologiczny.grep
- Sprawdź tylko zainstalowane lub zaktualizowane pakiety.awk -F ':a'
- Oddziel pole architektury od nazwy pakietucolumn -t
- całkiem wydrukuj kolumny oddzielone spacjąOczywiście chcielibyśmy stworzyć dla tego alias, ale niestety nie jest to możliwe, ponieważ awk zależy zarówno od pojedynczych, jak i podwójnych cudzysłowów. W związku z tym najlepiej umieścić to w skrypcie bash i tam, gdzie
:
separator jest obsługiwany lepiej dla innych architektur w kolumnie pola.Dane wyjściowe to:
Wada:
źródło
Zwracając na to uwagę, ponieważ wspominasz, że inne odpowiedzi dotyczące dystrybucji są mile widziane. rpm ma duży zestaw znaczników formatu wyjściowego, z których jednym jest INSTALLTIME. (
wget
Jako przykład)Można to sformatować na kilka sposobów. Używam tego w ten sposób:
Te dwie strony zawierają mnóstwo świetnych informacji na temat rozwiązywania problemów z metadanymi RPM:
http://www.rpm.org/max-rpm/s1-rpm-query-parts.html
http://www.rpm.org/max-rpm/s1-rpm-query-handy-queries.html
Posortowanie tych informacji zapewni działające rozwiązanie problemu.
źródło
Debian GNU / Linux nie ma wbudowanych narzędzi do tego problemu, ale wszystkie informacje o programach zainstalowanych w standardowy sposób są zapisywane w plikach o nazwie program.list w lokalizacji / var / lib / dpkg / info / . Ale nie ma tam informacji o ręcznie instalowanych programach.
Długie rozwiązanie jednoliniowe :
Objaśnienie :
ls -rt
wyświetla pliki posortowane według modyfikacji daty w odwrotnej kolejności, tj. z najnowszymi plikami na końcu listy.stat
drukuje datę pliku w postaci czytelnej dla człowieka.printf
wyświetla nazwę pakietu i datę jego ostatniej modyfikacji.for
Pętla jako całość nazw pakietów drukuje i terminach od najstarszego do najnowszego.Przykład wyjścia (obcięty):
Główną wadą tego rozwiązania jest to, że nie jest dobrze przetestowany w produkcji.
źródło
/var/lib/dpkg/info/
. Dlatego też/var/log/dpkg.log*
preferowane może być używanie .Jest szorstki, ale działa tak szybko, jak inne rozwiązania. Format daty to rrrrmmddggmmss, co oznacza, że bit lub zmiana kolejności i usunięcie formatu skutkuje liczbą, którą można posortować.
Wiele dzięki innym rozwiązaniom, ta lista nazw pakietów w kolejności instalacji, które mogą być użyte w wbudowanym systemie do kopiowania.
źródło