Como obtenho uma lista de pacotes que "fornecem" algo "usando o dpkg?

9

Eu vejo que o dpkg tem um campo "Fornece" para pacotes.

$ apt-cache show vim-tiny | grep Provides
Provides: editor
$

Como sei quais pacotes fornecem, ou seja, "editor"?

Janus Troelsen
fonte

Respostas:

4

Você pode obter o efeito desejado sem aptitude(o que parece desencorajado atualmente) usando apt-cache showpkg, que inclui uma lista de Reverse Provides. Piping-lo através de um pequeno sedscript irá se livrar das outras coisas:

apt-cache showpkg <package> | sed '/Reverse Provides/,$!d'

Um exemplo um pouco mais bonito (mas mais longo para digitar) (lista apenas os nomes dos pacotes, não as versões e os classifica em ordem alfabética) pode ser obtido com awk:

apt-cache showpkg httpd | awk '/Pa/, /Reverse P/ {next} {print $1 | "sort"}'

... e isso pode ser canalizado uniqpara remover duplicatas (que podem existir devido a várias versões do pacote serem fornecidas reversamente). Observe que o uso de uniqnão ajudará na primeira versão, pois uniqapenas remove duplicatas se estiverem em linhas adjacentes e a sedversão não classificar a saída.

Finalmente, pode-se definir uma função para facilitar o uso, como segue:

provides () { apt-cache showpkg $1 | awk '/Pa/, /Reverse P/ {next} {print $1 | "sort"}' | uniq;}

Coloque isso em (por exemplo) .bashrc, para que ele carregue quando o shell for carregado, e se torne possível executar provides <package>para obter o fornecimento reverso de um pacote.

Darael
fonte
sort -uremoverá as duplicatas; portanto, a chamada para uniqnão é necessária. Mas seja qual for, boa solução, é muito mais rápido. aptitudetambém corresponderão doom-wad-editor, portanto não são completamente equivalentes.
Janus Troelsen
Ooh, bom grito sort -u. Não sabia disso. Eu me pergunto por que não atende doom-wad-editor...? Isso é particularmente interessante, pois apt-cache showpkgmostra que ele não depende de nada.
Darael
Ah Uma inspeção mais aprofundada mostra que aptitudea pesquisa corresponderá a substrings no Provides:campo (portanto, seleção deutex), onde o apt-cache showpkgmétodo usa nomes exatos de pacotes. Ambos, portanto, presumivelmente têm seu lugar.
Darael
Eu acredito que deve ficar claro que <package>é um pacote virtual aqui. Como editor,.
x-yuri
@ x-yuri para que haja resultados, claro, mas isso é apenas porque um pacote virtual é um nome para o qual existe pelo menos uma Provides:linha no repositório. Da mesma maneira que apt-cache search, então, o resultado correto quando não há é falta de saída - que é o que essas opções fornecem. Pode haver versões concretas e virtuais do mesmo pacote, e suponho que poderíamos aprimorá-las para mostrar a versão concreta onde ela existe, mas é tudo.
Darael
7

O Aptitude também fornece essa funcionalidade. Portanto, um comando como este mostrará todos os pacotes que fornecem um editor.

aptitude search '~Peditor'

Você pode até adicionar outras restrições. Como mostra apenas editores instalados.

aptitude search '~i~Peditor'
Zoredache
fonte
Eu prefiro isso porque inclui muito mais pacotes do que as outras soluções. Minhas soluções mostraram apenas os pacotes listados com "i" (instalado) no início da linha. Esta solução também mostra linhas com "p" (significando que não existe nenhum rastreio do pacote no sistema).
Janus Troelsen
6
$ dpkg-query -W -f='Package: ${Package}\nProvides: ${Provides}\n' \
  | grep -B 1 -E "^Provides: .*editor"
Package: nano
Provides: editor
--
Package: vim-gnome
Provides: editor, gvim, vim, vim-perl, vim-python, vim-ruby, vim-tcl
--
Package: vim-tiny
Provides: editor
$
Janus Troelsen
fonte
1
-1: consulta apenas os pacotes instalados.
MoonSweep
@MoonSweep Concordo, no entanto, pode ser útil em alguns casos.
user.dz 29/04
0

Lendo o banco de dados diretamente:

#!/usr/bin/env python3
import sys
import shlex

def whichPkgsProvide(filter,l):
    for pkg in l:
            dic = {}
            pairs = [x.split(": ") for x in pkg.split("\n")]
            for j in pairs:
                    try:
                            dic[j[0]] = j[1]
                    except IndexError:
                            pass

            try:
                    if filter in dic["Provides"]:
                            yield dic["Package"]
            except KeyError:
                    pass


if __name__ == "__main__":
    l = sys.stdin.read().split("\n\n")
    print(list(whichPkgsProvide(sys.argv[1],l)))

Uso:

$ python3 whichPkgsProvide.py editor <  /var/lib/dpkg/available
['vim-gnome', 'nano', 'vim-tiny']
$
Janus Troelsen
fonte
-1

base no seu exemplo. Posso listar o pacote fornecido editorpelo usoapropos

hvn@lappy: ~ () $ apropos editor
atobm (1)            - bitmap editor and converter utilities for the X W...
bitmap (1)           - bitmap editor and converter utilities for the X W...
bmtoa (1)            - bitmap editor and converter utilities for the X W...
ed (1)               - text editor
editor (1)           - Vi IMproved, a programmers text editor
editres (1)          - a dynamic resource editor for X Toolkit applications
ex (1)               - Vi IMproved, a programmers text editor
gedit (1)            - text editor for the GNOME Desktop
gnome-text-editor (1) - text editor for the GNOME Desktop
gview (1)            - Vi IMproved, a programmers text editor
gvim (1)             - Vi IMproved, a programmers text editor
i3-sensible-editor (1) - launches $EDITOR with fallbacks
nano (1)             - Nano's ANOther editor, an enhanced free Pico clone
notepad (1)          - Wine text editor
pico (1)             - Nano's ANOther editor, an enhanced free Pico clone
psed (1)             - a stream editor
ptked (1p)           - an editor in Perl/Tk
red (1)              - text editor
regedit (1)          - Wine registry editor
rgview (1)           - Vi IMproved, a programmers text editor
rgvim (1)            - Vi IMproved, a programmers text editor
rnano (1)            - Restricted mode for Nano's ANOther editor, an enh...
rview (1)            - Vi IMproved, a programmers text editor
rvim (1)             - Vi IMproved, a programmers text editor
s2p (1)              - a stream editor
sdlBasic (1)         - sdlBasic program editor
sed (1)              - stream editor for filtering and transforming text
select-editor (1)    - select your default sensible-editor from all inst...
sensible-editor (1)  - sensible editing, paging, and web browsing
software-properties-gtk (1) - Software Sources List editor
Tk::ColorEditor (3pm) - a general purpose Tk widget Color Editor
vi (1)               - Vi IMproved, a programmers text editor
view (1)             - Vi IMproved, a programmers text editor
vim (1)              - Vi IMproved, a programmers text editor
winecfg (1)          - Wine Configuration Editor
xedit (1)            - simple text editor for X
zshzle (1)           - zsh command line editor
HVNSweeting
fonte
1
-1: apropospesquise nas páginas de manual, para listar apenas os comandos instalados ... Além disso, o OP deseja uma lista de pacotes .
MoonSweep