38

Я нахожусь в поиске чего-то аналогичного этому вопросу: Zypper: Как я могу отобразить все пакеты из определенного хранилища?

Поскольку я работаю в Ubuntu, мне нужно решение на основе aptitude: как я могу получить список установленных пакетов из определенного репозитория?

7 ответов7

18

После прочтения информационной страницы способностей и десятка попыток, я наконец-то получил это:

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

или эквивалент) :

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

Он будет искать пакеты, установленные из нестабильных архивов любого репозитория. Вы должны отфильтровать пакеты из вашего архива по умолчанию (тестирование в приведенном выше примере).

Если вы хотите отфильтровать пакеты, установленные с www.debian-multimedia.org/unstable:

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

Изменить: «Архив», «происхождение» и т.д. Вычитаются из файла Release хранилища. К сожалению, не все инструменты могут просматривать все эти строки, и они используют различный синтаксис для них. Вы можете найти эти файлы как /var/lib/apt/lists/*Release . Или просто введите apt-cache policy чтобы получить обзор. apt-cache изменил свой формат вывода: более поздние версии используют стиль apt_preferences.

  • Suite: или Archive: (старое имя!)
    • поиск aptitude: ?archive(___) или ~A___
    • формат aptitude: %t
    • apt_preferences: release a=___
    • Примеры Ubuntu: natty-backports , trusty-security , stable
  • Origin:
    • поиск aptitude: ?origin(___) или ~O___
    • формат aptitude: n/a
    • apt_preferences: release o=___
    • Примеры Ubuntu: Canonical , Google, Inc. , LP-PPA-dockbar-main , Ubuntu
  • все остальные строки
    • aptitude: n/a
17

Используя aptitude, для поиска установленных пакетов за пределами стабильной ветки вы можете использовать:

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

Чтобы увидеть версии, а также имена пакетов (и вместо описаний), вы можете использовать команду с параметром формата (для краткости -F ), как показано ниже.

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

Для большего количества форматов, пожалуйста, посмотрите на страницу руководства (здесь документация с опциями.).

Это работает, например, в Debian, если вы установили пакеты вне Squeeze (например, apt-get install -t sid package-name .

Вы можете посмотреть, откуда установленный пакет, с помощью apt-cache policy Использование выглядит следующим образом:

apt-cache policy <package-name>

Например, мой пакет python-numpy выдает следующий вывод:

$ 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

Это означает, что я на одну версию позади текущей ветки sid/main, поэтому у меня установлена старая версия sid. Я вижу, что у меня нет стабильного, потому что это все еще 1.4.1-5 , и я в настоящее время на 1.6.2-1 .

На момент отправки этот пакет уже был обновлен:)

15

Проверьте тег источника (например, o = Debian) для каждого из ваших текущих репозиториев:

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

Затем найдите пакеты из (или не из) определенного источника:

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

Это не подходит для аудита безопасности, потому что он полагается на каждый репозиторий для предоставления своей собственной информации о происхождении, но это может быть полезно для устранения проблем происхождения пакетов, которые присутствуют в нескольких репозиториях.

6

Для полноты: в системах Ubuntu вы также можете использовать Synaptic для этой задачи. В левом столбце вы можете отфильтровать пакеты по их происхождению.

2

Я нашел это:

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

Вы также можете найти список поисковых терминов, поддерживаемых "aptitude search" здесь.

2

Сначала найдите подходящий файл (ы) для интересующего хранилища в /var /lib /apt /lists. Должно быть возможно сделать это программно, но мне не нужно было этого делать.

Используя Google Chrome в качестве примера, попробуйте это:

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

и я получаю вывод:

google-chrome-stable

dpkg -s возвращает 0, если пакет установлен, и ненулевой в противном случае. Для будущих справочных целей вывод

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

было

Package: google-chrome-beta
Package: google-chrome-stable
Package: google-chrome-unstable
0

Другие ответы на самом деле неверны, потому что параметр ?archive() - это регулярное выражение. Так что ?archive(stable) соответствует как stable и unstable . Чтобы исключить только stable вам нужно привязать шаблон регулярного выражения:

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

Чтобы исключить несколько репозиториев:

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

Также обратите внимание, что некоторые пакеты принадлежат нескольким репозиториям, например, xenial-security,xenial-updates . ?archive() оценивает шаблон регулярного выражения для каждого репозитория индивидуально, так ?archive("^xenial-updates$") будет соответствовать любым пакетам, принадлежащим xenial-updates , даже если он также принадлежит другим репозиториям.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .