Wyświetl jawnie zainstalowane pakiety

53

W Gentoo znajduje się plik /var/lib/portage/worldzawierający pakiety, które wyraźnie zainstalowałem. Mówiąc wprost, mam na myśli pakiety, które wybrałem, nie włączając niczego domyślnie instalowanego lub pobranego przez zależności.

Czy istnieje podobny plik lub polecenie, aby znaleźć te informacje w Ubuntu?

phunehehe
źródło

Odpowiedzi:

46

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-columnszapobiega aptitude z linii dopełnienia nazwy pakietów z wykrojów, które utrudniają porównanie poniżej. Do | sort -urodzaju 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. commNarzę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.

Steven D.
źródło
Czego nie robi Twój pierwszy potok aptitude search '~i!~M' -F %p?
ephemient
@ephemient: Prawdopodobnie nic. Nie znam się zbytnio na umiejętnościach i dlatego użyłem znanych mi narzędzi, zamiast grzebać w pliku man programu, którego nigdy nie używam.
Steven D
1
W pewnym sensie niszczysz moją nadzieję, myślałem, że jest jakiś standardowy prosty sposób :(
phunehehe
3
To prawie działa, ale nadal nie jest poprawne. Istnieje wiele pakietów i bibliotek, których z pewnością nie zainstalowałem ręcznie, zawartych na wynikowej liście. Użyłem http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifesti dodatkowych, | sed "s/ *$//"ale nadal żadnych kości.
jmiserez
1
Pierwszym krokiem jest uzyskanie listy pakietów niezainstalowanych, ponieważ zależności można zastąpić apt-mark showmanual | sort -u, jak pokazano w innych odpowiedziach. Prostsze i nie polega na tym, aptitudektóry nie jest instalowany domyślnie.
skagedal
24

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:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Używanie aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

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:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Jak to działa

  1. Uzyskaj listę ręcznie zainstalowanych pakietów. Dla umiejętności, dodatkowe sedusuwa pozostałe białe znaki na końcu linii.
  2. Pobierz listę pakietów zainstalowanych zaraz po nowej instalacji.
  3. Porównaj pliki, wypisz tylko te wiersze w pliku 1, których nie ma w pliku 2.

Inne możliwości również nie działają:

  • Używanie ubuntu-14.04-desktop-amd64.manifestpliku ( 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ą.
  • Używanie apt-mark showautozamiast /var/log/installer/initial-status.gz. apt-markna przykład nie zawiera pakietu xserver-xorg, podczas gdy drugi plik tak.

Oba wyświetlają więcej pakietów niż powyższe rozwiązanie.

jmiserez
źródło
Jeśli uaktualniłeś swój system od czasu pierwszej instalacji (jak sądzę w przypadku większości osób), lepiej użyć pliku manifestu bieżącej wersji systemu Ubuntu.
Diego V
Jeśli dokonałeś aktualizacji, myślę, że będziesz musiał użyć obu plików, a nie tylko pliku manifestu. Możesz to łatwo zrobić, dodając kolejne porównanie. Plik manifestu niestety nie zawiera wszystkiego, co zawiera plik initial_status.gz (sprawdziłem).
jmiserez
Jestem pod wrażeniem! Znalazłem jednak brakujący element. Co z pakietami, które były początkowo instalowane, ale następnie jawnie ręcznie usuwane , ale później jawnie instalowane ręcznie ? Znalazłem to w działającym systemie.
n611x007,
1
Zadałem pytanie unix.SE/225330: Lista jawnie usuniętych pakietów (apt), aby rozwiązać większość zadania.
n611x007,
1
Jest to lepsze niż zaakceptowane rozwiązanie, ponieważ mirror.pnl.gov/releases/precise/… URL w zaakceptowanym rozwiązaniu ma teraz 404.
rmunn
9

Według man apt-mark:

apt-mark showauto
apt-mark showmanual
mmaruska
źródło
2
showmanualpokazuje rzeczy xserver-xorg-video-vesa, które, przysięgam, nie zainstalowałem ręcznie.
phunehehe
prawdopodobnie instalowany automatycznie przez twoją dystrybucję przy pierwszej instalacji.
Matt
8

Oto kilka przykładowych danych wyjściowych cat /var/log/apt/history.log:

Start-Date: 2011-01-22  00:43:38
Commandline: apt-get --target-release experimental install libdbus-1-dev
Upgrade: libdbus-1-3:i386 (1.4.0-1, 1.4.1-1), libdbus-1-dev:i386 (1.4.0-1, 1.4.1-1)
End-Date: 2011-01-22  00:43:48

Start-Date: 2011-01-23  01:16:13
Commandline: apt-get --auto-remove purge webcheck
Purge: python-utidylib:i386 (0.2-6), python-beautifulsoup:i386 (3.1.0.1-2), libtidy-0.99-0:i386 (20091223cvs-1), webcheck:i386 (1.10.3)
End-Date: 2011-01-23  01:16:31

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:

$ ls /var/log/apt/history.log*
-rw-r--r-- 1 root root 69120 2011-01-23 18:58 /var/log/apt/history.log
-rw-r--r-- 1 root root 19594 2011-01-01 02:48 /var/log/apt/history.log.1.gz

UWAGA :

  • Sprawdziłem zarówno aptitude, jak i synaptic (odpowiednio wersje 0.70 i 0.6.3 ) i oboje rejestrują swoje działania w tym pliku dziennika. Jedną z nich jest to, że nie mają linii zaczynającej się od Commandline, więc grepsztuczka nie będzie z nimi działać.
tshepang
źródło
2
Ciekawe rozwiązanie Musisz trochę dostosować polecenie grep, aby uzyskać listę pakietów i uwzględnić pakiety zainstalowane przez aptitudeinnych menedżerów pakietów. Jeśli twoje dzienniki się odwróciły, to nie masz szczęścia.
Steven D
@steven Zaktualizowano. Moje grep-fu jest nowicjuszem, więc zostawię to czytelnikowi. Nie wiem też, czy coś się obraca. Sam muszę tam tylko złożyć akta.
tshepang 23.01.11
To, czy będą się obracać, będzie zależeć od konfiguracji logrotate i od tego, jak długo twój system był w pobliżu. Nie jestem pewien co do domyślnych ustawień Ubuntu, ponieważ minęło sporo czasu, odkąd je zmieniłem.
Steven D
7

Podczas szukania tego zapytania natknąłem się na ten piękny oneliner

Jedna wkładka to

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )`

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.

Archit
źródło
3

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 .

Stefan
źródło
3
link wydaje się już nie działać.
rog
2
Takie niedziałające linki powodują, że ważne jest, aby w odpowiedzi podać odpowiednie informacje.
whitehat101
2

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:

aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt

To wydaje się działać:

aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt

zobacz tę odpowiedź

Wes Turner
źródło
1

Sprawdzić /var/log/apt/term.log

Joril
źródło
2
że to raczej bolesna droga do robienia rzeczy, i nie ma rozróżnienia między pakietami zainstalować sobie, a te zainstalowane poprzez zależności
phunehehe
Zgadzam się, ale nie wiedziałem, że apt śledzi te: / Teraz wiem, dzięki Stefanowi :)
Joril
1

Możesz także spojrzeć na plik /var/lib/apt/extended_states.

cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'

Jest to przydatne, jeśli chcesz wiedzieć, co zostało zainstalowane na starej partycji.

Laurent Lyaudet
źródło
0

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

info='/var/lib/dpkg/info/'

comm -13 > /tmp/packages \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

while read n; do
  echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
    | tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*/\1/') $n
done < /tmp/packages | sort
Papou
źródło