it-swarm-pt.tech

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, isso é.

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?

446
David Z

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

De man dpkg:

 - S, --search nome do arquivo-padrão de pesquisa ... 
 Procure 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 buntu Packages Search

413
Ressu

O comando apt-file pode fazer isso por você na linha de comando. Eu uso freqüentemente quando estou construindo pacotes a partir do código fonte. Para arquivos fornecidos por pacotes que já estão instalados em seu sistema, apt-cache é outra opção.

Para instalar o 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 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 site buntu Packages Search . Eles têm uma opção para "pesquisar o conteúdo de pacotes" para um nome de arquivo específico.

226
jbowtie

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

apt-file list packagename
43
ptman

Você pode pesquisar o conteúdo dos pacotes incluídos nos vários lançamentos do Ubuntu no site buntu Packages . Olhe sob o cabeçalho " 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

17
moberley

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 on-line aqui , na seção Search the contents of packages.

enter image description here

Exemplo

enter image description here

13
A.B.

Esta é uma extensão para excelente resposta de Alexx Roche . Eu tentei fazer uma edição para essa resposta, mas ela foi rejeitada (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 [email protected]) 2>/dev/null)"
[ -z "$BINARY" ] && BINARY="[email protected]"
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 script apt-whatprovides 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 resultou:

[email protected]:~ $ apt-whatprovides ping
Searching for /bin/ping
inetutils-ping: /bin/ping
iputils-ping: /bin/ping

[email protected]:~ $ 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 Searching for é um caminho completo para ping (instalado) e apenas o nome binário para Dig não está instalado. Isso me ajudou a descobrir que eu precisava instalar o dnsutils sem precisar pesquisar https://packages.ubuntu.com/#search_contents

3
Bruno Bronosky

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 [email protected]))
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$'
3
Alexx Roche

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

2
Rory