Найти пакеты, установленные из определенного хранилища с способностью

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

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

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

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

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

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

Для получения дополнительных форматов ознакомьтесь с man-страницей (здесь есть документация с опциями avail ).

Это работает, например, в 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 .

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

После прочтения информационной страницы aptitude и дюжины попыток я, наконец, получил следующее:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Я нашел это:

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

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

Сначала найдите подходящий файл (ы) для интересующего репозитория в / 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 
Давайте будем гением компьютера.