Domanda Come trovo il pacchetto che fornisce un file?


Domanda abbastanza semplice: c'è un comando di 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 sia in realtà venuto 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?


381
2017-07-30 08:10


origine


Mi sono sempre chiesto questo: so che con YUM puoi fare yum whatprovides <filepath> / <filename> ma non ho mai trovato un'alternativa a quella in Aptitude oltre al sito web di Packages - Marco Ceppi♦
Lo stesso su SU: superuser.com/questions/10997/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
Nessuna delle risposte qui in realtà copre il Provides: meccanismo. Più in dettaglio, un comando come mailx o sendmail non è incluso come binario in qualunque pacchetto; invece, vari pacchetti installano i propri binari e poi ne rendono disponibili alcuni sotto un nome "canonico" /etc/alternatives. Guarda anche askubuntu.com/questions/366135/... - tripleee


risposte:


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

A partire dal man dpkg:

-S, --search filename-search-pattern ...
                  Cerca un nome file dai pacchetti installati.

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 il Ricerca di pacchetti di Ubuntu


359
2017-07-30 08:42



Consiglio vivamente di usare dlocate, che viene aggiornato quotidianamente per ricerche più veloci. - Daniel T Chen
Suggerimento: se non conosci il percorso completo, ma solo il nome del comando, usa which per trovare lui programma: dpkg -S `which firefox` - Lekensteyn
Questo funziona anche per le librerie, che è particolarmente utile se si dispone di un file binario che non verrà eseguito perché è possibile ispezionarlo con ldd e utilizzare i percorsi di libreria completi per trovare i pacchetti mancanti. - Alain O'Dea
@DanielTChen, ma dlocate potrebbe non fare il lavoro, se il database di dlocate non è aggiornato. Devi chiamare sudo update-dlocatedb per aggiornarlo. - jarno
Se dpkg il percorso esatto non restituisce nulla (ad es. dpkg /usr/bin/java), prova solo il nome dell'eseguibile (ad es. dpkg java). - Dan Dascalescu


Il apt-file il comando 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'altra scelta.

Installare apt-file, fare:

sudo apt-get install apt-file

Quindi, è necessario 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

Comunque un modo molto più amichevole è usare il Ricerca di pacchetti di Ubuntu sito web. Hanno un'opzione per "cercare il contenuto dei pacchetti" per un nome file specifico.


187
2017-08-11 02:43



Secondo me questa dovrebbe essere la risposta accettata. Ma in risposta a Ricerca di pacchetti di Ubuntu, Potrei obiettare che un programma di shell così semplice è estremamente amichevole e facile da ricordare (una volta che lo conosci). Se utilizzi dpkg, apt-get o aptitude come strumenti standard, non c'è niente di amichevole nell'attivare Chrome per navigare in Internet! - user2097818
@ 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-file spesso trova falsi positivi, ovvero pacchetti che non sono installati. Ovviamente questa risposta è ottima per la "domanda bonus". - David Z
Per quelli dalla parte di Redhat del mondo - apt-file search <> è l'analogo più vicino a dnf/yum whatprovides <>. - ffledgling


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

apt-file list packagename

35
2017-07-30 08:49



esattamente quello che stavo cercando. Grazie - NES


Puoi cercare il contenuto dei pacchetti inclusi nelle varie versioni di Ubuntu sul Pacchetti di Ubuntu sito web. Guarda sotto la voce "Cerca il contenuto dei pacchetti".

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

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


16
2017-08-11 02:42





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


10
2017-11-29 15:57



Intendi, quale pacchetto e non quale applicazione. L'applicazione è il gestore dei pacchetti, ad es. Centro Software. Va bene. Grazie! :) - ReyKev
Grazie per tutto l'aiuto! Nessuno di questi suggerimenti mi ha aiutato a trovare quale pacchetto ha installato queste / queste applicazioni. Tutte le ricerche riportano semplicemente a "Tracker". Sospettavo che fosse comunque Canopy di Enthoughts. Il miglio EULA mi ha ricordato il mio vecchio stordimento 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 sbarazzato, insieme a Canopy di Enthoughts e, tutti i problemi sono stati risolti. Ti ringrazio davvero per il tuo aiuto. È una grande cosa avere un tale supporto. Grazie ancora! Kevin - ReyKev


Stavo cercando di rintracciare cosa 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 COSA puoi usare

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

2
2018-03-17 15:25



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 fatto un backup a gist.github.com/RichardBronosky/... e creerò la mia risposta se la rigetti / la rigetti. - Bruno Bronosky
Aggiornamento: Sembra viscido copiare la pasta in questa risposta e apportarvi modifiche minime, ma la mia modifica è stata rifiutata. Spero ti sentirai come se avessi mantenuto l'integrità della tua risposta nel mio. - Bruno Bronosky
Sentiti libero di modificare o hackerare; tutto ciò che lo rende migliore per te (è per questo che ho aggiunto la Licenza MIT! Non ho nemmeno bisogno di credito). - Alexx Roche


Questa è un'estensione a L'eccellente risposta di Alexx Roche. Ho provato a fare una modifica per quella risposta, ma è stato respinto (anche se non di Alexx)


Stavo cercando di rintracciare cosa 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}"

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

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

Per THING non installati, puoi utilizzare:

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

Il apt-whatprovides lo script funziona per i file che sono e non sono nel tuo sistema. Ad esempio, il mio sistema mancava dig ma aveva ping quindi questo è ciò che è 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

Notare 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 dnsutilssenza bisogno di andare a cercare https://packages.ubuntu.com/#search_contents


2
2017-07-18 05:45



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


Una ragione per cui potresti doverlo fare è se stai compilando software che esiste già un pacchetto di Ubuntu, puoi eseguire apt-get build-dep $PACKAGENAME. Questo installerà tutti i pacchetti che dovrai compilare $PACKAGENAME.


1
2017-08-11 19:31