it-swarm.it

Come trovo il pacchetto che fornisce un file?

Domanda abbastanza semplice: c'è qualche comando Shell (o metodo GUI) che posso usare, dato il percorso di un file sul mio sistema, mi dice quale pacchetto lo ha messo lì? Supponendo che il file provenga effettivamente da un pacchetto, cioè.

Domanda bonus: cosa succede se si tratta di un file che non è installato sul mio sistema? Esiste, ad esempio, un sito Web che mi consenta di cercare un file e vedere quali pacchetti lo forniscono?

460
David Z

Puoi usare il comando dpkg per scoprire quale pacchetto installato possiede un file:

Da man dpkg:

 - S, --search nomefile-modello-ricerca ... 
 Cerca un nome file dai pacchetti installati. 

Esempio:

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

Puoi cercare con un percorso completo o solo con il nome file.

Se desideri cercare file non ancora installati sul tuo computer, puoi usare buntu Packages Search

427
Ressu

Il comando apt-file può farlo per te dalla riga di comando. Lo uso spesso durante la creazione di pacchetti dal sorgente. Per i file forniti da pacchetti che sono già installati sul tuo sistema, apt-cache è un'altra scelta.

Per installare _apt-file_, eseguire:

_Sudo apt-get install apt-file
_

Quindi, è necessario aggiornare il suo database:

_apt-file update
_

E, infine, cerca nel file:

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

Tuttavia, un modo molto più amichevole è usare il sito Web buntu Packages Search . Hanno un'opzione per "cercare il contenuto dei pacchetti" per un nome file specifico.

235
jbowtie

C'è anche apt-file per cercare i file nei pacchetti che non sono installati. Per esempio:

apt-file list packagename
43
ptman

Puoi cercare il contenuto dei pacchetti inclusi nelle varie versioni di Ubuntu sul sito Web buntu Packages . Guarda sotto l'intestazione " Cerca nel contenuto dei pacchetti ".

Ad esempio, ecco i risultati della ricerca per libnss3.so in lucido (10.04):

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

17
moberley

Intendi quale pacchetto e non quale applicazione. L'applicazione è il gestore dei pacchetti, ad es. Software Center.

Utilizzando dpkg:

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

Esempio

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

Utilizzando apt-file:

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

o anche possibile:

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

Esempio

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

O online qui , nella sezione Search the contents of packages.

enter image description here

Esempio

enter image description here

13
A.B.

Questa è un'estensione di ottima risposta di Alexx Roche . Ho provato a fare una modifica a quella risposta, ma è stato rifiutato (anche se non da Alexx)


Stavo cercando di rintracciare ciò che era installato which sul mio sistema. Dopo un po 'di lavoro ho creato /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}"

Sebbene per la maggior parte delle COSE installate puoi semplicemente usare:

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

Per COSE che non sono installate, puoi usare:

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

Lo script apt-whatprovides funziona per i file che si trovano e non si trovano sul tuo sistema. Ad esempio, il mio sistema mancava Dig ma aveva ping quindi questo ha prodotto:

[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

Si noti che Searching for è un percorso completo per ping (installato) e solo il nome binario per Dig non installato. Questo mi ha aiutato a scoprire che dovevo installare dnsutils senza bisogno di andare alla ricerca https://packages.ubuntu.com/#search_contents

3
Bruno Bronosky

Stavo cercando di rintracciare ciò che era installato which sul mio sistema. Dopo un po 'di lavoro ho creato 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%:*}

Sebbene per la maggior parte delle COSE puoi semplicemente usare

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

Uno dei motivi per cui potresti dover fare questo è se stai compilando un software che esiste già un pacchetto Ubuntu, puoi eseguire apt-get build-dep $PACKAGENAME. Verranno installati tutti i pacchetti necessari per compilare $PACKAGENAME.

2
Rory