Como encontro o pacote que fornece um arquivo?

389

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 veio de fato 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 permita procurar um arquivo e ver quais pacotes, se houver, fornecem?

    
por David Z 30.07.2010 / 10:10

8 respostas

364

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

De man dpkg :

-S, --search filename-search-pattern...
                  Search for a filename from installed packages.

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 a Pesquisa de Pacotes do Ubuntu

    
por Ressu 30.07.2010 / 10:42
191

O comando apt-file 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 no seu sistema, apt-cache é outro escolha.

Para instalar o apt-file , faça:

sudo apt-get install apt-file

Em seguida, você precisa atualizar o 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 Search para Ubuntu Packages . Eles têm a opção de "pesquisar o conteúdo dos pacotes" para um nome de arquivo específico.

    
por jbowtie 11.08.2010 / 04:43
36

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

apt-file list packagename
    
por ptman 30.07.2010 / 10:49
16

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

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

link

    
por moberley 11.08.2010 / 04:42
11

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 .

Exemplo

    
por A.B. 29.11.2015 / 16:57
2

Eu estava tentando rastrear o que instalou 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$'
    
por Alexx Roche 17.03.2018 / 16:25
2

Esta é uma extensão da 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 instalou 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 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:

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 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 dnsutils sem precisar pesquisar link

    
por Bruno Bronosky 18.07.2018 / 07:45
1

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 executar apt-get build-dep $PACKAGENAME . Isso instalará todos os pacotes necessários para compilar $PACKAGENAME .

    
por Rory 11.08.2010 / 21:31