Znajdź pakiety zainstalowane z określonego repozytorium z aptitude

Odpowiedzi:

17

Korzystając z aptitude, aby wyszukać zainstalowane pakiety poza stabilną gałęzią, możesz użyć:

aptitude search "?narrow(?installed,?not(?archive(stable)))"

Aby zobaczyć wersje, a także nazwy pakietów (i zamiast opisów), możesz użyć polecenia z opcją formatowania ( -Fw skrócie) w następujący sposób.

aptitude search -F "%p %V %v" "?narrow(?installed,?not(?archive(stable)))"

Więcej formatów można znaleźć na stronie podręcznika (tutaj jest dokumentacja z dostępnymi opcjami ).

Działa to na przykład w Debianie, jeśli zainstalowałeś pakiety poza Squeeze (na przykład przez uruchomienie apt-get install -t sid package-name.

Możesz sprawdzić, skąd pochodzi zainstalowany pakiet apt-cache policy, użycie jest następujące:

apt-cache policy <package-name>

Na przykład mój pakiet python-numpy renderuje następujące dane wyjściowe:

$ LANG=C apt-cache policy python-numpy
python-numpy:
  Installed: 1:1.6.2-1
  Candidate: 1:1.6.2-1.2
  Version table:
     1:1.7.0-1 0
          1 http://ftp.es.debian.org/debian/ experimental/main amd64 Packages
     1:1.6.2-1.2 0
        500 http://ftp.es.debian.org/debian/ sid/main amd64 Packages
 *** 1:1.6.2-1 0
        100 /var/lib/dpkg/status
     1:1.4.1-5 0
        990 http://ftp.es.debian.org/debian/ squeeze/main amd64 Packages
        990 http://ftp.de.debian.org/debian/ squeeze/main amd64 Packages

Oznacza to, że jestem jedną wersją za obecną gałęzią sid / main, więc mam zainstalowaną wersję starszego sida. Widzę, że nie mam stabilnego, ponieważ jest jeszcze 1.4.1-5i jestem obecnie na 1.6.2-1.

W chwili przesłania pakiet ten był już zaktualizowany:)

ssice
źródło
Wolę ?any-version(), ponieważ ~narrow(pat1, pat2)jest taki sam ?any-version(pat1 pat2)i obsługuje ?any-version(pat1 pat2 pat3)bez wyglądania głupio.
Robert Siemer
18

Po przeczytaniu strony informacyjnej o umiejętnościach i kilkunastu próbach w końcu otrzymałem:

aptitude search '?narrow(?installed,?not(?archive(testing)) ?archive(unstable))'

lub odpowiednik) :

aptitude search '~S ~i (!~Atesting ~Aunstable)'

Przeszukuje pakiety zainstalowane z niestabilnych archiwów dowolnego repozytorium. Musisz odfiltrować pakiety z domyślnego archiwum (testowanie w powyższym przykładzie).

Jeśli chcesz filtrować pakiety zainstalowane z www.debian-multimedia.org/unstable:

aptitude search '~S ~i (!~Atesting ~Aunstable ?origin("Unofficial Multimedia Packages"))

Edycja: „Archiwum”, „pochodzenie” itp. Są odejmowane z Releasepliku repozytorium. Niestety nie wszystkie narzędzia mogą patrzeć na wszystkie te linie i używają dla nich innej składni. Możesz znaleźć te pliki jako /var/lib/apt/lists/*Release. Lub po prostu wpisz, apt-cache policyaby uzyskać przegląd. apt-cache zmienił format wyjściowy: nowsze wersje używają stylu apt_preferences.

  • Suite:lub Archive:(stara nazwa!)
    • wyszukiwanie umiejętności: ?archive(___)lub~A___
    • format umiejętności: %t
    • apt_preferences: release a=___
    • Ubuntu przykładów: natty-backports, trusty-security,stable
  • Origin:
    • wyszukiwanie umiejętności: ?origin(___)lub~O___
    • format umiejętności: nie dotyczy
    • apt_preferences: release o=___
    • Przykłady: Ubuntu Canonical, Google, Inc., LP-PPA-dockbar-main,Ubuntu
  • wszystkie inne linie
    • aptitude: n / a
Christophe
źródło
15

Sprawdź znacznik pochodzenia (taki jak o = Debian ) dla każdego z twoich bieżących repozytoriów:

apt-cache policy | sed -n 's/.*o=\([^,]\+\).*/\1/p' | uniq

Następnie wyszukaj paczki z określonego źródła (lub nie z niego):

aptitude search "?installed?origin(Debian)"
aptitude search "?installed?not(?origin(Debian))"

To nie nadaje się do kontroli bezpieczeństwa, ponieważ opiera się na każdego repozytorium, aby zapewnić własne informacje o pochodzeniu, ale może to być pomocne w rozwiązywaniu problemów pochodzenie pakietów, które są obecne w wielu repozytoriach.

Anonimowy
źródło
2
Twoje aptitude searchwzory nie są dobre. - Wybierają tak, jak ta „lista pakietów, na której zainstalowana jest jedna wersja, a każda inna wersja istnieje w Debianie” lub „jakaś wersja zainstalowana, i co najmniej jedna wersja tego pakietu dostępna na non-Debian”. - Szukamy „zainstalowanej wersji pochodzi z Debiana (lub nie)”. Należy to zrobić za pomocą ?narrow()lub ?any-version().
Robert Siemer
Zatwardziały. Zainstalowałem nemo-filerollerz linuxmint, ale też istnieje Debian. Tak więc pojawia się na liście, ponieważ jest zainstalowany i istnieje gdzieś w Debianie.
Boldewyn
6

Dla kompletności: w systemach Ubuntu możesz również użyć Synaptic do tego zadania. W lewej kolumnie możesz filtrować paczki według ich pochodzenia.

Boldewyn
źródło
Próbowałem to zrobić i znalazłem ten post SU za pośrednictwem Google, nie mogę uwierzyć, że przeoczyłem Synaptic, dzięki!
David Claridge
@RobertSiemer Być może zwróciło twoją uwagę, że zaakceptowałem ją po dwóch dniach bez wystarczającej odpowiedzi, a przed inną odpowiedzią. Przyjąłem ją, ponieważ rozwiązało to mój problem. Głosowałem również za wszystkimi późniejszymi odpowiedziami, ale proszę o wybaczenie, nigdy nie zmieniłem stanu akceptacji. Zauważysz również w FAQ tej witryny, że nie wyciągnąłem żadnej reputacji z tego ruchu, w rzeczywistości straciłem 2 powtórzenia za nieakceptowanie odpowiedzi innej osoby . Więc cofnij się w przyszłości, zanim osądzisz czyjeś decyzje publicznie i przemyślisz możliwe przyczyny.
Boldewyn
2

Znalazłem to:

aptitude search "?origin (<repository>) ?installed"

Możesz również znaleźć listę wyszukiwanych haseł obsługiwanych przez „wyszukiwanie umiejętności” tutaj .

max
źródło
Dlaczego musisz to uruchomić sudo? Wydaje mi się, że działa to również bez uruchamiania go jako root.
Andre Holzner,
Nie trzeba go uruchamiać w sudo
Kurtis Nusbaum
Jak skomentowałem odpowiedź @Anonim, nie ma to pożądanego efektu.
Robert Siemer
2

Najpierw znajdź odpowiedni plik (i) dla interesującego repozytorium w / var / lib / apt / list. Powinno być możliwe zrobienie tego programowo, ale nie musiałem tego robić.

Korzystając z Google Chrome jako przykładu, spróbuj tego:

SEARCH_PATTERN=dl.google.com_linux_chrome  # adjust to suit your needs

for PKG in $( grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages | sed 's/^Package: //' )
do
    if dpkg -s "${PKG}" 2> /dev/null 1> /dev/null
    then
        echo ${PKG}
    fi
done

i otrzymuję wynik:

google-chrome-stable

dpkg -s zwraca 0, jeśli pakiet jest zainstalowany, a niezerowe w przeciwnym razie. Do celów odniesienia w przyszłości wynik

grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages

było

Package: google-chrome-beta
Package: google-chrome-stable
Package: google-chrome-unstable
coreyh
źródło
... czy to wykorzystuje aptitude?
Robert Siemer
2
@RobertSiemer Jak to jest istotne? Pytanie, zakładając rozsądną znajomość języka angielskiego, brzmi: jak znaleźć źródło pakietów, które zostały zainstalowane z aptitude . Nie ma wymogu, aby rozwiązanie korzystało z aptitude.
Auspex
@Auspex, uważam inaczej. - I nie martw się, kilka lat temu moja znajomość języka angielskiego przekroczyła „rozsądny”.
Robert Siemer,
2
Najwyraźniej nie ...
Auspex
2
@Auspex: próbujesz mnie sprowokować? Jest odwrotnie: pytanie dotyczy rozwiązania opartego na aptitude, a nie na pakietach instalowanych z aptitude.
Robert Siemer
0

Pozostałe odpowiedzi są w rzeczywistości niepoprawne, ponieważ parametr to ?archive()jest wyrażeniem regularnym. Więc ?archive(stable)pasuje zarówno do, jak stablei do unstable. Aby wykluczyć stable, musisz zakotwiczyć wzór wyrażenia regularnego:

aptitude search -F "%p %V %v %t" '?any-version(?installed ?not(?archive("^stable$")))'

Aby wykluczyć wiele repozytoriów:

aptitude search -F "%p %V %v %t" '?any-version(?installed ?not(?archive("^(xenial|xenial-updates)$")))'

Należy również pamiętać, że niektóre pakiety należą do wielu repozytoriów, np xenial-security,xenial-updates. ?archive()ocenia wzorzec wyrażenia regularnego dla każdego repozytorium indywidualnie, więc ?archive("^xenial-updates$")dopasuje wszystkie pakiety należące do xenial-updates, nawet jeśli należą one również do innych repozytoriów.

Animizm
źródło