Come trovo il pacchetto che fornisce un file?

398

Domanda abbastanza semplice: c'è un comando shell (o un 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 provenisse da un pacchetto, cioè.

Domanda bonus: cosa succede se si tratta di un file che non è installato sul mio sistema? C'è, per esempio, un sito web che mi permetterà di cercare un file e vedere quali pacchetti, se ce ne sono, fornirlo?

    
posta David Z 30.07.2010 - 10:10
fonte

8 risposte

373

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

Da man dpkg :

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

Esempio:

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

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

Se desideri cercare file non ancora installati sul tuo computer, puoi utilizzare la Ricerca di pacchetti di Ubuntu

    
risposta data Ressu 30.07.2010 - 10:42
fonte
196

Il comando apt-file può farlo per te dalla riga di comando. Lo uso spesso quando costruisco pacchetti dal sorgente. Per i file forniti da pacchetti già installati sul tuo sistema, apt-cache è un altro scelta.

Per installare apt-file , fai:

sudo apt-get install apt-file

Quindi, devi aggiornare il suo database:

apt-file update

E, infine, cerca il 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 è quello di utilizzare il sito web Ricerca pacchetti di Ubuntu . Hanno un'opzione per "cercare il contenuto dei pacchetti" per un nome file specifico.

    
risposta data jbowtie 11.08.2010 - 04:43
fonte
39

C'è anche apt-file per cercare file in pacchetti che non sono installati. Ad esempio:

apt-file list packagename
    
risposta data ptman 30.07.2010 - 10:49
fonte
16

Puoi cercare i contenuti dei pacchetti inclusi nelle varie versioni di Ubuntu nel sito web Pacchetti di Ubuntu . Guarda sotto l'intestazione " Cerca nel contenuto dei pacchetti ".

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

link

    
risposta data moberley 11.08.2010 - 04:42
fonte
11

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

Uso di Software Center :

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

Uso di dpkg :

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

Oppure online qui , nella sezione apt-file .

Esempio

    
risposta data A.B. 29.11.2015 - 16:57
fonte
3

Stavo cercando di rintracciare cosa ha 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 $@))
PACKAGE=$(apt-file search $BINARY|grep -E ":\s*${BINARY}$")
echo ${PACKAGE%:*}

Anche se per la maggior parte delle COSE puoi semplicemente usare

apt-file search $(realpath $(which THING))|grep 'THING$'
    
risposta data Alexx Roche 17.03.2018 - 16:25
fonte
3

Questa è un'estensione della risposta eccellente di Alexx Roche . Ho provato a modificare la risposta, ma è stato rifiutato (anche se non da Alexx)

Stavo cercando di rintracciare cosa ha 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 $@) 2>/dev/null)"
[ -z "$BINARY" ] && BINARY="$@"
echo Searching for $BINARY
PACKAGE="$(apt-file search $BINARY|grep -E ":.*[^-.a-zA-Z0-9]${BINARY}$")"
echo "${PACKAGE}"

Anche se per la maggior parte dei THING che sono installati puoi semplicemente usare:

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

Per THING che non sono installati, puoi usare:

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

Lo script apt-whatprovides funziona per i file che sono e non sono sul tuo sistema. Ad esempio, il mio sistema non aveva dig ma aveva ping , quindi è stato il risultato:

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

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 avevo bisogno di installare dnsutils senza dover andare a cercare link

    
risposta data Bruno Bronosky 18.07.2018 - 07:45
fonte
1

Un motivo per cui potresti doverlo fare è se stai compilando software che esiste già un pacchetto ubuntu, puoi eseguire apt-get build-dep $PACKAGENAME . Questo installerà tutti i pacchetti necessari per compilare $PACKAGENAME .

    
risposta data Rory 11.08.2010 - 21:31
fonte

Leggi altre domande sui tag