Найти пакеты, установленные из определенного репозитория с aptitude


39

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

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

Ответы:


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.

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


Я предпочитаю ?any-version(), потому что ~narrow(pat1, pat2)это так же, как ?any-version(pat1 pat2)и поддерживает, ?any-version(pat1 pat2 pat3)не выглядя глупо.
Роберт Симер

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:(старое имя!)
    • поиск способностей: ?archive(___)или~A___
    • формат пригодности: %t
    • apt_preferences: release a=___
    • Ubuntu примеров natty-backports, trusty-security,stable
  • Origin:
    • поиск способностей: ?origin(___)или~O___
    • Формат пригодности: н / д
    • apt_preferences: release o=___
    • Примеры Ubuntu: Canonical, Google, Inc., LP-PPA-dockbar-main,Ubuntu
  • все остальные строки
    • способность: н / д

15

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

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

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

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

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


2
Ваши aptitude searchобразцы не хороши. - Они выбирают, как этот «список пакетов, в которых установлена ​​одна версия, и любая другая версия существует в Debian» или «установлена ​​какая-то версия, и по крайней мере одна версия этого пакета доступна в не-Debian». - Что мы ищем, так это «установленная версия от Debian (или нет)». Это должно быть сделано с помощью ?narrow()или ?any-version().
Роберт Симер

Подтверждено. Я установил nemo-filerollerс linuxmint, но он Debianтоже существует. Так что он появляется в списке, потому что он установлен и существует где-то из Debian.
Болдевин

6

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


Я пытался сделать это и нашел этот пост SU через Google, не могу поверить, что я пропустил Synaptic, спасибо!
Дэвид Кларидж

@RobertSiemer Возможно, ваше внимание могло ускользнуть, потому что я принял его после двух дней без достаточного ответа и до того, как прозвучал любой другой ответ. Я принял его, потому что это решило мою проблему. Я также проголосовал за все последующие ответы, но, прошу прощения, никогда не менял состояние принятия. Вы также заметите, что на этом сайте часто задаваемые вопросы, что я не получил никакой репутации от этого шага, где на самом деле я потерял 2 повторения за то, что не принял чужой ответ. Поэтому, пожалуйста, сделайте шаг назад в будущем, прежде чем судить о чьих-либо решениях публично и переосмыслить возможные причины.
Болдевин

2

Я нашел это:

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

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


Зачем вам нужно запустить это с sudo? Мне кажется, что это также работает без запуска от имени пользователя root.
Андре Хольцнер

Это не нужно запускать с sudo
Kurtis Nusbaum

Как я прокомментировал @Anonymous ответ, это не дает желаемого эффекта.
Роберт Симер

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

... это использует aptitude?
Роберт Симер

2
@RobertSiemer Как это актуально? Вопрос, при условии разумного владения английским языком, заключается в том, как найти источник пакетов, которые были установлены с помощью aptitude . Нет требования, чтобы решение использовало aptitude.
Auspex

@Auspex, я считаю иначе. - И не волнуйтесь, мое владение английским превосходило «разумное» пару лет назад.
Роберт Симер

2
Очевидно нет ...
Auspex

2
@Auspex: ты пытаешься спровоцировать меня? Верно обратное: вопрос заключается в том, чтобы найти решение, основанное на aptitude, а не на пакетах, установленных с aptitude.
Роберт Симер

0

Другие ответы на самом деле неверны, потому что параметр to ?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, даже если он также принадлежит другим репозиториям.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.