Questão Como faço para encontrar o pacote que fornece um arquivo?


Pergunta bastante simples: existe algum comando shell (ou método GUI) que eu possa usar, dado o caminho para um arquivo no meu sistema, me diz qual pacote colocou lá? Assumindo que o arquivo realmente veio de um pacote, isto é.

Pergunta bônus: e se for um arquivo que não está instalado no meu sistema? Existe, digamos, um site que me permitirá procurar um arquivo e ver quais pacotes, se houver, fornecem?


382
2017-07-30 08:10


origem


Eu sempre me perguntei isso - eu sei que com o YUM você pode fazer o yum que fornece <filepath> / <filename>, mas eu nunca encontrei uma alternativa para isso no Aptitude além do site do Packages - Marco Ceppi♦
O mesmo em SU: superuser.com/questions/10997/… - Ciro Santilli 新疆改造中心 六四事件 法轮功
Nenhuma das respostas aqui realmente cobre o Provides: mecanismo. Em mais detalhes, um comando como mailx ou sendmail não está incluído como um binário em qualquer pacote; em vez disso, vários pacotes instalam seus próprios binários e, em seguida, disponibilizam alguns deles sob um nome "canônico" via /etc/alternatives. Veja também askubuntu.com/questions/366135/… - tripleee


Respostas:


Você pode usar dpkg comando para descobrir qual pacote instalado possui um arquivo:

A partir de man dpkg:

-S, --search nome do arquivo-search-pattern ...
                  Procure por um nome de arquivo dos pacotes instalados.

Exemplo:

$ dpkg -S /bin/ls
coreutils: /bin/ls

Você pode pesquisar com um caminho completo ou apenas com o nome do arquivo.

Se você deseja procurar por arquivos ainda não instalados no seu computador, você pode usar o Pesquisa de Pacotes do Ubuntu


360
2017-07-30 08:42



Eu recomendo usar o dlocate, que é atualizado diariamente para pesquisas mais rápidas. - Daniel T Chen
Dica: se você não conhece o caminho completo, mas apenas o nome do comando, use which para encontrar o programa: dpkg -S `which firefox` - Lekensteyn
Isso funciona também para bibliotecas, o que é particularmente útil se você tiver um binário que não será executado porque você pode inspecioná-lo com ldd e usar os caminhos de biblioteca completos para encontrar os pacotes que estão faltando. - Alain O'Dea
@DanielTChen, mas dlocate pode não fazer o trabalho, se o banco de dados do dlocate estiver desatualizado. Você tem que ligar sudo update-dlocatedb para atualizá-lo. - jarno
E se dpkg o caminho exato não retorna nada (por exemplo, dpkg /usr/bin/java), tente apenas o nome do executável (por exemplo, dpkg java). - Dan Dascalescu


o apt-file comando pode fazer isso por você na linha de comando. Eu uso frequentemente quando construo pacotes a partir do código fonte. Para arquivos fornecidos por pacotes que já estão instalados em seu sistema, apt-cache é outra escolha.

Para instalar apt-file, Faz:

sudo apt-get install apt-file

Então, você precisa atualizar seu banco de dados:

apt-file update

E, finalmente, pesquise no arquivo:

$ apt-file find kwallet.h
kdelibs5-dev: /usr/include/kwallet.h
libkf5wallet-dev: /usr/include/KF5/KWallet/kwallet.h

No entanto, uma maneira muito mais amigável é usar o Pesquisa de Pacotes do Ubuntu local na rede Internet. Eles têm uma opção para "pesquisar o conteúdo de pacotes" para um nome de arquivo específico.


187
2017-08-11 02:43



Na minha opinião, esta deveria ser a resposta aceita. Mas em resposta a Pesquisa de Pacotes do UbuntuEu poderia argumentar que um programa shell tão simples é extremamente amigável e fácil de lembrar (uma vez que você sabe disso). Se você usa o dpkg, o apt-get ou o aptitude como ferramentas padrão, não há nada amigável em ativar o Chrome para navegar na Internet! - user2097818
@ user2097818 A razão pela qual esta não é a resposta aceita é que a minha questão principal é restrita a arquivos no sistema e pacotes que estão instalados. apt-file geralmente encontra falsos positivos, ou seja, pacotes que não estão instalados. Claro que esta resposta é ótima para a "questão bônus". - David Z
Para aqueles do lado Redhat do mundo - apt-file search <> é o análogo mais próximo de dnf/yum whatprovides <>. - ffledgling


Há também o apt-file para procurar arquivos em pacotes que não estão instalados. Por exemplo:

apt-file list packagename

35
2017-07-30 08:49



exatamente o que eu estava procurando. obrigado - NES


Você pode pesquisar o conteúdo de pacotes incluídos nos vários lançamentos do Ubuntu no Pacotes Ubuntu local na rede Internet. Olhe sob o cabeçalho "Pesquise o conteúdo dos pacotes".

Por exemplo, aqui estão os resultados de pesquisa para libnss3.so em lucid (10.04):

http://packages.ubuntu.com/search?searchon=contents&keywords=libnss3.so&mode=exactfilename&suite=lucid&arch=any


16
2017-08-11 02:42





Você quer dizer qual pacote e não qual aplicativo. O aplicativo é seu gerenciador de pacotes, por exemplo, Software Center.

Usando dpkg:

dpkg -S /usr/lib/tracker/tracker-store
dpkg -S tracker-extract
dpkg -S tracker-miner-fs

Exemplo

% dpkg -S /usr/lib/tracker/tracker-store
tracker: /usr/lib/tracker/tracker-store

Usando apt-file:

apt-file search /usr/lib/tracker/tracker-store

ou também possível:

apt-file search --regex /tracker-extract$
apt-file search --regex /tracker-miner-fs$

Exemplo

% apt-file search /usr/lib/tracker/tracker-store
tracker: /usr/lib/tracker/tracker-store

Ou online Aqui, na seção Search the contents of packages.

enter image description here

Exemplo

enter image description here


10
2017-11-29 15:57



Você quer dizer qual pacote e não qual aplicativo. O aplicativo é seu gerenciador de pacotes, por exemplo, Centro de Software. OK. Obrigado! :) - ReyKev
Obrigado por toda a ajuda! Nenhuma dessas sugestões me ajudou a encontrar qual pacote instalou esses / esses aplicativos. Todas as pesquisas levam apenas para "Rastreador". Eu suspeitava que fosse o Enopyts 'Canopy. Esse longo EULA me lembrou do meu velho Microsoft Windows daze, com o qual, estou tão feliz por não estar mais envolvido. Eu vi que o Tracker foi instalado ontem então, como root, eu me livrei dele, junto com Enthoughts 'Canopy e, todos os problemas estão resolvidos. Eu realmente agradeço por toda sua ajuda. É uma coisa tão boa ter esse apoio. Obrigado novamente! Kevin - ReyKev


Eu estava tentando rastrear o que estava instalado which no meu sistema. Depois de um pouco de trabalho eu criei o apt-whatprovides

#!/bin/sh
#apt-whatprovides ver. 201801010101 Copyright alexx, MIT Licence
#rdfa:deps="[realpath,apt-file,grep,which,sh,echo]"

BINARY=$(realpath $(which $@))
PACKAGE=$(apt-file search $BINARY|grep -E ":\s*${BINARY}$")
echo ${PACKAGE%:*}

Embora para a maioria das coisas você pode simplesmente usar

apt-file search $(realpath $(which THING))|grep 'THING$'

2
2018-03-17 15:25



Alexx, eu amo essa resposta. Espero que você não se importe com a minha edição. Eu também fiz isso funcionar para arquivos que não estão instalados no sistema. Eu fiz um backup em gist.github.com/RichardBronosky/… e criará minha própria resposta se você a reverter / rejeitar. - Bruno Bronosky
Atualização: É uma sensação viscosa copiar a pasta dessa resposta e fazer alterações sutis, mas minha edição foi rejeitada. Espero que você sinta que eu mantive a integridade da sua resposta no meu. - Bruno Bronosky
Sinta-se à vontade para editar ou hackear; qualquer coisa que o torne melhor para você (é por isso que eu adicionei o MIT License! Eu nem preciso de crédito.) - Alexx Roche


Esta é uma extensão para A excelente resposta de Alexx Roche. Eu tentei fazer uma edição para essa resposta, mas foi rejeitado (embora não por Alexx)


Eu estava tentando rastrear o que estava instalado which no meu sistema. Depois de um pouco de trabalho eu criei /usr/local/bin/apt-whatprovides

#!/bin/sh
#apt-whatprovides ver. 201801010101 Copyright alexx, MIT Licence
#rdfa:deps="[realpath,apt-file,grep,which,sh,echo]"

BINARY="$(realpath $(which $@) 2>/dev/null)"
[ -z "$BINARY" ] && BINARY="$@"
echo Searching for $BINARY
PACKAGE="$(apt-file search $BINARY|grep -E ":.*[^-.a-zA-Z0-9]${BINARY}$")"
echo "${PACKAGE}"

Embora para a maioria das COISAS instaladas, você pode simplesmente usar:

apt-file search $(realpath $(which THING)) | grep 'THING$'

Para COISAS que não estão instaladas, você pode usar:

apt-file search THING | grep '/THING$'

o apt-whatprovides script funciona para arquivos que estão e não estão no seu sistema. Por exemplo, meu sistema não tinha dig mas tinha ping então isso o que resultou:

pi@raspberrypi:~ $ apt-whatprovides ping
Searching for /bin/ping
inetutils-ping: /bin/ping
iputils-ping: /bin/ping

pi@raspberrypi:~ $ apt-whatprovides dig
Searching for dig
dnsutils: /usr/bin/dig
epic4: /usr/share/epic4/script/dig
epic4-help: /usr/share/epic4/help/8_Scripts/dig
knot-dnsutils: /usr/bin/dig

Notar que Searching for é um caminho completo para ping (instalado) e apenas o nome binário para dig não instalado. Isso me ajudou a descobrir que eu precisava instalar dnsutilssem precisar ir pesquisar https://packages.ubuntu.com/#search_contents


2
2017-07-18 05:45



Esta é uma resposta tão boa que eu deveria deletar a minha! - Alexx Roche


Uma razão pela qual você pode ter que fazer isso é se você está compilando um software que já existe um pacote do Ubuntu, você pode rodar apt-get build-dep $PACKAGENAME. Isso irá instalar todos os pacotes que você precisa para compilar $PACKAGENAME.


1
2017-08-11 19:31