Como encontro o pacote que fornece um arquivo?

468

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 o colocou lá? Supondo que o arquivo realmente veio de um pacote, é isso.

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

David Z
fonte
6
Eu sempre me perguntei isso mesmo - eu sei com YUM você pode fazer yum whatprovides <filepath> / <filename>, mas eu nunca ter encontrado uma alternativa para que no Aptidão diferente do site do Pacotes
Marco Ceppi
Mesmo no SU: superuser.com/questions/10997/…
Ciro Santilli escreveu:
Nenhuma das respostas aqui realmente cobre o Provides:mecanismo. Mais detalhadamente, um comando como mailxou sendmailnão é incluído como binário em nenhum 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:

439

Você pode usar o dpkgcomando para descobrir qual pacote instalado possui um arquivo:

De man dpkg:

-S, --search nome do arquivo-pesquisa-padrão ...
                  Procure um nome de arquivo nos 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 arquivos ainda não instalados no seu computador, use a Pesquisa de Pacotes Ubuntu

Ressu
fonte
5
Eu recomendo usar o dlocate, que é atualizado diariamente para pesquisas mais rápidas.
Daniel T Chen
20
Dica: se você não souber o caminho completo, mas apenas o nome do comando, use whichpara encontrar o programa:dpkg -S `which firefox`
Lekensteyn 7/11
1
@DanielTChen, mas dlocatepode não fazer o trabalho, se o banco de dados do dlocate estiver desatualizado. Você precisa ligar sudo update-dlocatedbpara atualizá-lo.
Jarno
2
Se dpkgo caminho exato não retornar nada (por exemplo dpkg /usr/bin/java), tente apenas o nome do executável (por exemplo dpkg java).
Dan Dascalescu 21/01
2
Você também pode usar realpathpara resolver links simbólicos, como este: dpkg -S $(realpath $(which <command>)).
Lars Nyström
236

O apt-filecomando pode fazer isso por você na linha de comando. Eu o uso frequentemente ao criar pacotes a partir do código-fonte. Para arquivos fornecidos por pacotes que já estão instalados no seu sistema, apt-cacheé outra opção.

Para instalar apt-file, faça:

sudo apt-get install apt-file

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

apt-file update

E, finalmente, pesquise o 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 site de pesquisa de pacotes do Ubuntu . Eles têm a opção de "pesquisar o conteúdo dos pacotes" por um nome de arquivo específico.

jbowtie
fonte
21
Na minha opinião, essa deve ser a resposta aceita. Mas, em resposta à pesquisa de pacotes do Ubuntu , posso argumentar que um programa shell tão simples é extremamente amigável e fácil de lembrar (depois que você o conhece). Se você usa o dpkg, o apt-get ou o aptitude como ferramentas padrão, não há nada amigável em iniciar o Chrome para navegar na Internet!
User2097818
3
@ user2097818 A razão pela qual essa não é a resposta aceita é que minha pergunta principal é restrita a arquivos no sistema e pacotes instalados. apt-filegeralmente encontra falsos positivos, ou seja, pacotes que não estão instalados. É claro que essa resposta é ótima para a "pergunta bônus".
David Z
3
Para aqueles do lado Redhat do mundo - apt-file search <>é o mais próximo análogo dnf/yum whatprovides <>.
Ffledgling 29/04/19
I alias apt-file findcomo apt-findhá muito tempo e é realmente útil! Btw, as versões mais recentes requerem raiz para apt-file update.
val
43

Também existe o arquivo apt para procurar arquivos em pacotes que não estão instalados. Por exemplo:

apt-file list packagename
ptman
fonte
17

Você pode pesquisar o conteúdo dos pacotes incluídos nas várias versões do Ubuntu no site de pacotes do Ubuntu . Procure sob o título " Pesquisar o conteúdo dos pacotes ".

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

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

moberley
fonte
Isso recentemente retorna apenas um erro.
Pawel Veselov
13

Você quer dizer qual pacote e não qual aplicativo. A aplicação é o 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.

insira a descrição da imagem aqui

Exemplo

insira a descrição da imagem aqui

AB
fonte
Você quer dizer qual pacote e não qual aplicativo. O aplicativo é seu gerenciador de pacotes, por exemplo, Software Center. OK. Obrigado! :)
ReyKev
Obrigado por toda a ajuda! Nenhuma dessas sugestões me ajudou a encontrar qual pacote instalou esses aplicativos. Todas as pesquisas apenas retornam ao "Rastreador". Eu suspeitava que fosse o dossel dos Enthoughts. Esse EULA de uma milha me lembrou meu antigo torpor do Microsoft Windows, com o qual estou tão feliz por não estar mais envolvido. Vi que o Tracker foi instalado ontem, então, como root, me livrei dele, junto com o Enthoughts 'Canopy e todos os problemas foram resolvidos. Eu realmente agradeço por toda a sua ajuda. É uma grande coisa ter esse apoio. Obrigado novamente! Kevin
ReyKev
4

Esta é uma extensão da excelente resposta de Alexx Roche . Tentei fazer uma edição dessa resposta, mas ela foi rejeitada (embora não por Alexx)


Eu estava tentando rastrear o que estava instalado whichno 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ê possa usar:

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

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

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

O apt-whatprovidesscript funciona para arquivos que estão e não estão no seu sistema. Por exemplo, meu sistema não possuía, digmas tinha pingisso 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

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

Bruno Bronosky
fonte
Esta é uma resposta tão boa que devo excluir a minha!
Alexx Roche
3

Eu estava tentando rastrear o que estava instalado whichno meu sistema. Depois de um pouco de trabalho, 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ê possa usar

apt-file search $(realpath $(which THING))|grep 'THING$'
Alexx Roche
fonte
1
Alexx, eu amo essa resposta. Espero que você não se importe com a minha edição. Eu fiz isso também funcionar para arquivos que não estão instalados no sistema. Fiz um backup em gist.github.com/RichardBronosky/… e criará minha própria resposta se você a reverter / rejeitar.
Bruno Bronosky
Atualização: parece difícil copiar esta resposta para massas e fazer alterações sutis, mas minha edição foi rejeitada. Espero que você sinta que mantive a integridade da sua resposta na minha .
18718 Bruno Bronosky
Sinta-se livre para editar ou hackear; qualquer coisa que faz com que seja melhor para você, (é por isso que eu adicionei MIT License Eu nem sequer precisam de crédito!.)
Alexx Roche
2

Uma razão pela qual você pode precisar fazer isso é que, se estiver compilando software com um pacote ubuntu, você poderá executar apt-get build-dep $PACKAGENAME. Isso instalará todos os pacotes que você precisa compilar $PACKAGENAME.

Rory
fonte