Знайдіть пакунки, встановлені з певного сховища з належними можливостями


39

Я шукаю щось аналогічне цьому питанню: Zypper: Як відобразити всі пакунки з певного сховища?

Оскільки я перебуваю на Ubuntu, мені потрібно рішення, що базується на придатності: Як я можу отримати список встановлених пакетів з певного сховища?

Відповіді:


17

Використовуючи придатність, щоб шукати встановлені пакети за межами стабільної гілки, ви можете використовувати:

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___
    • формат придатності: n / a
    • 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 Можливо, це пропустило вашу увагу, що я прийняв це через два дні без достатньої відповіді, і перш ніж будь-який з інших відповідей не прийшов. Я прийняв це, тому що це вирішило мою проблему. Я також схвалив усі пізніші відповіді, але, прошу пробачення, ніколи не змінив умови прийняття. Ви також зауважите на FAQ на цьому сайті, що я не отримав жодної репутації від цього кроку, де насправді я втратив 2 повторення за те, що не прийняв чужої відповіді. Тож, будь ласка, зробіть крок назад у майбутньому, перш ніж судити чиїсь рішення у відкритому просторі та переосмислити можливі причини.
Boldewyn

2

Я знайшов це:

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

Ви також можете знайти список пошукових термінів , підтримуваних «профпридатність пошуку» тут .


Навіщо вам це запускати sudo? Мені здається, що це також працює, не запускаючи його як root.
Андре Хольцнер

Це не потрібно запускати з судо
Куртис Нусбаум

Як я коментував відповідь @Anonymous, це не дає бажаного ефекту.
Роберт Сімер

2

Спочатку знайдіть відповідні файли (файли) для сховища, що цікавить / var / lib / apt / списки. Це має бути можливо зробити програмно, але мені цього не потрібно було.

Використовуючи 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

... це використовує здатність?
Роберт Сімер

2
@RobertSiemer Наскільки це актуально? Питання, передбачаючи розумне володіння англійською мовою, полягає в тому, як знайти джерело пакунків, які були встановлені з придатністю . Немає вимоги, щоб рішення використовувало здатність.
Auspex

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

2
Мабуть, ні ...
Auspex

2
@Auspex: ти мене намагаєшся спровокувати? Це навпаки: питання запитує рішення на основі здатності, а не для пакетів, встановлених з придатністю.
Роберт Сімер

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.