Tylko kod
aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest \
| cut -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt
Wyjaśnienie
Jednym ze sposobów myślenia o tym problemie jest podzielenie go na trzy części:
- Jak uzyskać listę pakietów niezainstalowanych jako zależności?
- Jak uzyskać listę domyślnie instalowanych pakietów?
- Jak mogę uzyskać różnicę między tymi dwiema listami?
Jak uzyskać listę pakietów niezainstalowanych jako zależności?
Następujące polecenie wydaje się działać w moim systemie:
$ aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
Podobne podejście można znaleźć w linkach, które Gilles opublikował jako komentarz do pytania. Niektóre źródła twierdzą, że zadziała to tylko wtedy, gdy użyłeś aptitude do zainstalowania pakietów; jednak prawie nigdy nie używam aptitude do instalowania pakietów i stwierdziłem, że nadal działa. W --disable-columns
zapobiega aptitude z linii dopełnienia nazwy pakietów z wykrojów, które utrudniają porównanie poniżej. Do | sort -u
rodzaju pliku i usuwa duplikaty. To znacznie ułatwia ostatni krok.
Jak uzyskać listę domyślnie instalowanych pakietów?
Uwaga: ta sekcja zaczyna się od „złej ścieżki”, która moim zdaniem jest ilustracyjna. Drugi fragment kodu to ten, który działa.
To trochę trudniejsze. Początkowo myślałem, że dobrym przybliżeniem będą wszystkie pakiety, które są zależnościami od meta-pakietów ubuntu-minimal, ubuntu-standard, ubuntu-desktop i różnych pakietów związanych z jądrem Linuksa. Wydaje się, że kilka wyników wyszukiwania Google używało tego podejścia. Aby uzyskać listę tych zależności, najpierw wypróbowałem następujące (które nie działały):
$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u
To wydaje się pomijać niektóre pakiety, które, jak wiem, musiały być dostarczane domyślnie. Nadal uważam, że ta metoda powinna działać, jeśli zbuduje się odpowiednią listę metapakietów.
Wygląda jednak na to, że mirrory Ubuntu zawierają plik „manifestu”, który zawiera wszystkie pakiety w domyślnej instalacji. Manifest dla Ubuntu 12.04.3 jest tutaj:
http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest
Jeśli przeszukujesz tę stronę (lub stronę lustra bliżej Ciebie):
http://mirror.pnl.gov/releases/precise/
Powinieneś być w stanie znaleźć plik „.manifest”, który odpowiada używanej wersji i architekturze. Aby wyodrębnić tylko nazwy pakietów, zrobiłem to:
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f1 | sort -u > defaultinstalled.txt
Lista prawdopodobnie była już posortowana i unikalna, ale chciałem się upewnić, że została odpowiednio posortowana, aby ułatwić następny krok. Następnie wstawiam wyjście defaultinstalled.txt
.
Jak mogę uzyskać różnicę między tymi dwiema listami?
Jest to najłatwiejsza część, ponieważ większość systemów uniksowych ma do tego wiele narzędzi. comm
Narzędzie jest jednym z wielu sposobów, aby to zrobić:
comm -23 currentlyinstalled.txt defaultinstalled.txt
Powinno to wydrukować listę wierszy unikalnych dla pierwszego pliku. Dlatego powinien wydrukować listę zainstalowanych pakietów, których nie ma w domyślnej instalacji.
aptitude search '~i!~M' -F %p
?http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifest
i dodatkowych,| sed "s/ *$//"
ale nadal żadnych kości.apt-mark showmanual | sort -u
, jak pokazano w innych odpowiedziach. Prostsze i nie polega na tym,aptitude
który nie jest instalowany domyślnie.Możesz użyć jednej z tych dwóch linijek. Oba dają dokładnie taką samą wydajność na moim komputerze i są bardziej precyzyjne niż wszystkie rozwiązania proponowane do tej pory (lipiec 2014) w tym pytaniu. Są kombinacją dwóch odpowiedzi (1) i (2) . Pamiętaj, że pierwotnie opublikowałem tę odpowiedź tutaj .
Używanie
apt-mark
:Używanie
aptitude
:Bardzo niewiele pakietów wciąż przechodzi przez pęknięcia, chociaż podejrzewam, że są one faktycznie instalowane przez użytkownika, albo bezpośrednio po instalacji poprzez konfigurację lokalizacji języka lub np. Przez instalator kodeków Totem. Wydaje się, że również wersje nagłówka linuxa kumulują się, mimo że zainstalowałem tylko niespecyficzny dla metapakietu pakiet. Przykłady:
Jak to działa
sed
usuwa pozostałe białe znaki na końcu linii.Inne możliwości również nie działają:
ubuntu-14.04-desktop-amd64.manifest
pliku ( tutaj dla Ubuntu 14.04) zamiast/var/log/installer/initial-status.gz
. Więcej pakietów jest wyświetlanych jako zainstalowane ręcznie, nawet jeśli nie są.apt-mark showauto
zamiast/var/log/installer/initial-status.gz
.apt-mark
na przykład nie zawiera pakietu xserver-xorg, podczas gdy drugi plik tak.Oba wyświetlają więcej pakietów niż powyższe rozwiązanie.
źródło
Według
man apt-mark
:źródło
showmanual
pokazuje rzeczyxserver-xorg-video-vesa
, które, przysięgam, nie zainstalowałem ręcznie.Oto kilka przykładowych danych wyjściowych
cat /var/log/apt/history.log
:Jeśli chodzi o twoje pytanie, odfiltruj rzeczy za pomocą grep (
cat /var/log/apt/history.log | grep Commandline
).Pamiętaj, że te pliki są obrócone, więc sprawdź, czy nie ma innych:
UWAGA :
Commandline
, więcgrep
sztuczka nie będzie z nimi działać.źródło
aptitude
innych menedżerów pakietów. Jeśli twoje dzienniki się odwróciły, to nie masz szczęścia.Podczas szukania tego zapytania natknąłem się na ten piękny oneliner
Jedna wkładka to
Ten oneliner filtruje pakiety instalowane przez system za pomocą logów z
/var/log/installer/initial-status.gz
Kiedy go znajdę, opublikuję link do oryginalnego wątku, ponieważ ten oneliner nie jest mój i nie pamiętam, gdzie go widziałem.
źródło
Chciałbyś rzucić okiem na ten artykuł .
Na końcu artykułu znajduje się skrypt w języku Python, który powinien robić to, co chcesz.
Został napisany dla (k) ubuntu . ale powinien również działać dla Ubuntu .
źródło
Poniżej jest dodatkiem do Stevena D's odpowiedź .
Następująca linia wydaje się obcinać nazwy pakietów o długości 32 znaków:
To wydaje się działać:
zobacz tę odpowiedź
źródło
Sprawdzić
/var/log/apt/term.log
źródło
Możesz także spojrzeć na plik
/var/lib/apt/extended_states
.Jest to przydatne, jeśli chcesz wiedzieć, co zostało zainstalowane na starej partycji.
źródło
Ogromne podziękowania i gratulacje dla tych, którzy wymyślili ten klejnot scenariusza !!!
Chciałem dodać moje 2 centy i podałem datę instalacji, którą wydedukowałem z $ info.
Nie opanowałem szczegółów, dlaczego pliki $ $ są aktualizowane czy nie, i kiedy, ale to działa w praktyce.
Mój skrypt wyświetla najnowsze aktualizacje pakietów niezależnych dodane po instalacji.
Poddając go okresowej kontroli, widziałem, co bym ręcznie zalogował, bez żadnej spóźnienia.
Oznacza to, że pakiety pakietów są instalowane z tego samego powodu. Niestety aktualizacje psują porządek.
Po aktualizacji systemu miałem listę dodanych pakietów, których aktualizacja nie zaktualizowała, a następnie te, które zrobiła.
Schludny! Cieszyć się.
źródło