Come trovo il pacchetto che fornisce un file?


468

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?


6
Me lo sono sempre chiesto da solo - so che con YUM puoi fare ciò che yum fornisce <filepath> / <filename> ma non ho mai trovato un'alternativa a quello in Aptitude diverso dal sito web dei Pacchetti
Marco Ceppi


Nessuna delle risposte qui in realtà copre il Provides:meccanismo. Più in dettaglio, un comando simile mailxo sendmailnon è incluso come binario in nessun pacchetto; invece, vari pacchetti installano i propri binari e ne rendono disponibili alcuni con un nome "canonico" tramite /etc/alternatives. Vedi anche askubuntu.com/questions/366135/…
tripleee il

Risposte:


439

È possibile utilizzare il dpkgcomando 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 si desidera cercare file non ancora installati sul proprio computer, è possibile utilizzare la Ricerca pacchetti Ubuntu


5
Consiglio vivamente di usare dlocate, che viene aggiornato quotidianamente per ricerche più veloci.
Daniel T Chen,

20
Suggerimento: se non si conosce il percorso completo, ma solo il nome del comando, utilizzare whichper trovare il programma:dpkg -S `which firefox`
Lekensteyn

1
@DanielTChen, ma dlocatepotrebbe non fare il lavoro, se il database di Dlocate non è aggiornato. Devi chiamare sudo update-dlocatedbper aggiornarlo.
jarno,

2
Se dpkgil percorso esatto non restituisce nulla (ad es. dpkg /usr/bin/java), Prova solo il nome dell'eseguibile (ad es dpkg java.).
Dan Dascalescu,

2
È inoltre possibile utilizzare realpathper risolvere i collegamenti simbolici, come questo: dpkg -S $(realpath $(which <command>)).
Lars Nyström,

237

Il apt-filecomando 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 è utilizzare il sito Web di ricerca dei pacchetti Ubuntu . Hanno un'opzione per "cercare il contenuto dei pacchetti" per un nome file specifico.


21
Secondo me questa dovrebbe essere la risposta accettata. Ma in risposta alla ricerca di pacchetti Ubuntu , potrei sostenere che un programma shell così semplice è estremamente amichevole e facile da ricordare (una volta che lo sai). Se usi dpkg, apt-get o aptitude come strumenti standard, non c'è nulla di amichevole nel far funzionare Chrome per navigare in Internet!
user2097818

3
@ user2097818 Il motivo per cui questa non è la risposta accettata è che la mia domanda principale è limitata ai file sul sistema e ai pacchetti installati. apt-filetrova spesso falsi positivi, ovvero pacchetti che non sono installati. Naturalmente questa risposta è ottima per la "domanda bonus".
David Z,

3
Per quelli dal lato Redhat del mondo - apt-file search <>è l'analogo più vicino a dnf/yum whatprovides <>.
Sfogliando il

I aliasing apt-file findcome apt-findtanto tempo fa ed è davvero a portata di mano! A proposito, le ultime versioni richiedono root per apt-file update.
val

43

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

apt-file list packagename


13

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.

inserisci qui la descrizione dell'immagine

Esempio

inserisci qui la descrizione dell'immagine


Intendi quale pacchetto e non quale applicazione. L'applicazione è il gestore dei pacchetti, ad esempio Software Center. Va bene. Grazie! :)
ReyKev,

Grazie per tutto l'aiuto! Nessuno di questi suggerimenti mi ha aiutato a trovare quale pacchetto ha installato questa / queste applicazioni. Tutte le ricerche portano a "Tracker". Tuttavia, sospettavo fosse il baldacchino di Enthoughts. Quel miglia lungo EULA mi ha ricordato il mio vecchio caos di Microsoft Windows, con il quale sono così felice di non essere più coinvolto. Ho visto che Tracker è stato installato ieri, quindi, come root, me ne sono liberato, insieme a Canopy di Enthoughts e, tutti i problemi sono stati risolti. Ti ringrazio davvero per tutto il tuo aiuto. È davvero fantastico avere un tale supporto. Grazie ancora! Kevin
ReyKev,

4

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


Stavo cercando di rintracciare ciò che è installato whichsul 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}"

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 apt-whatprovidesscript funziona per i file che si trovano e non si trovano sul tuo sistema. Ad esempio, il mio sistema mancava digma aveva pingquindi questo che ne è 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 dignon installato. Questo mi ha aiutato a scoprire che dovevo installare dnsutilssenza dover cercare https://packages.ubuntu.com/#search_contents


Questa è una buona risposta che dovrei eliminare la mia!
Alexx Roche,

3

Stavo cercando di rintracciare ciò che è installato whichsul 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%:*}

Sebbene per la maggior parte delle COSE puoi semplicemente usare

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

1
Alexx, adoro questa risposta. Spero non ti dispiaccia la mia modifica. L'ho fatto funzionare anche per i file che non sono installati sul sistema. Ho effettuato un backup su gist.github.com/RichardBronosky/… e creerò la mia risposta se la ripristini / la rifiuti.
Bruno Bronosky,

Aggiornamento: sembra viscido copiare pasta questa risposta e apportare sottili modifiche ad essa, ma la mia modifica è stata respinta. Spero che tu abbia sentito di aver mantenuto l'integrità della tua risposta nella mia .
Bruno Bronosky,

Sentiti libero di modificare o hackerare; tutto ciò che lo rende migliore per te (ecco perché ho aggiunto la licenza MIT! Non ho nemmeno bisogno di credito.)
Alexx Roche

2

Uno dei motivi per cui potresti doverlo fare è se stai compilando un software che esiste già un pacchetto Ubuntu, puoi eseguirlo apt-get build-dep $PACKAGENAME. Ciò installerà tutti i pacchetti che devi compilare $PACKAGENAME.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.