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
?