Vraag Hoe vind ik het pakket dat een bestand biedt?


Eenvoudig genoeg vraag: is er een shell-opdracht (of GUI-methode) die ik kan gebruiken, gezien het pad naar een bestand op mijn systeem, vertelt me ​​welk pakket het daar heeft geplaatst? Aangenomen dat het bestand inderdaad uit een pakket komt, dat wil zeggen.

Bonusvraag: wat als het een bestand is dat niet op mijn systeem is geïnstalleerd? Is er bijvoorbeeld een website waarop ik een bestand kan opzoeken en zien welke pakketten er eventueel in voorkomen?


381
2017-07-30 08:10


oorsprong


Ik heb dit altijd zelf afgevraagd - ik weet met YUM dat je kunt doen yum whatprovides <filepath> / <filename> maar ik heb nooit echt een alternatief gevonden voor dat in Aptitude anders dan de Packages-website - Marco Ceppi♦
Hetzelfde op SU: superuser.com/questions/10997/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
Geen van de antwoorden hier behandelt de Provides: mechanisme. In meer detail, een commando zoals mailx of sendmail is niet als binair bestand opgenomen ieder pakket; in plaats daarvan installeren verschillende pakketten hun eigen binaries en maken ze vervolgens via een "canonieke" naam beschikbaar /etc/alternatives. Zie ook askubuntu.com/questions/366135/... - tripleee


antwoorden:


Je kunt gebruiken dpkg commando om te achterhalen welk geïnstalleerd pakket een bestand bezit:

Van man dpkg:

-S, --zoek bestandsnaam-zoekpatroon ...
                  Zoek naar een bestandsnaam uit geïnstalleerde pakketten.

Voorbeeld:

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

U kunt zoeken met een volledig pad of met alleen de bestandsnaam.

Als u wilt zoeken naar bestanden die nog niet op uw computer zijn geïnstalleerd, kunt u de Ubuntu-pakketten zoeken


359
2017-07-30 08:42



Ik raad ten zeerste aan dlocate te gebruiken, dat dagelijks wordt bijgewerkt voor snellere opzoekingen. - Daniel T Chen
Tip: als u niet het volledige pad kent, maar alleen de opdrachtnaam, gebruikt u which om het programma te vinden: dpkg -S `which firefox` - Lekensteyn
Dit werkt ook voor bibliotheken, wat vooral handig is als je een binair bestand hebt dat niet wordt uitgevoerd, omdat je het met ldd kunt inspecteren en de volledige bibliotheekpaden kunt gebruiken om de pakketten te vinden die je mist. - Alain O'Dea
@DanielThen, maar dlocate kan het werk niet doen, als de database van dlocate verouderd is. Je moet bellen sudo update-dlocatedb om het te updaten. - jarno
Als dpkg het exacte pad retourneert niets (bijv. dpkg /usr/bin/java), probeer alleen de naam van het uitvoerbare bestand (bijv. dpkg java). - Dan Dascalescu


De apt-file commando kan dit voor u doen via de opdrachtregel. Ik gebruik het vaak bij het bouwen van pakketten van de bron. Voor bestanden die worden geleverd door pakketten die al op uw systeem zijn geïnstalleerd, apt-cache is een andere keuze.

Installeren apt-file, doen:

sudo apt-get install apt-file

Vervolgens moet u de database bijwerken:

apt-file update

En, ten slotte, doorzoek het bestand:

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

Een veel vriendelijker manier is echter om de Ubuntu-pakketten zoeken website. Ze hebben een optie om "de inhoud van pakketten te doorzoeken" voor een specifieke bestandsnaam.


187
2017-08-11 02:43



Naar mijn mening zou dit het geaccepteerde antwoord moeten zijn. Maar als antwoord op Ubuntu-pakketten zoeken, Ik zou kunnen beweren dat een shell-programma zo eenvoudig is uiterst vriendelijk en gemakkelijk te onthouden (als je het eenmaal weet). Als u dpkg, apt-get of aptitude als standaardgereedschap gebruikt, is er niets vriendelijks aan het doen van Chrome om op internet te surfen! - user2097818
@ user2097818 De reden dat dit niet het geaccepteerde antwoord is, is dat mijn primaire vraag beperkt is tot bestanden op het systeem en pakketten die zijn geïnstalleerd. apt-file vindt vaak valse positieven, dat wil zeggen pakketten die niet zijn geïnstalleerd. Natuurlijk is dit antwoord geweldig voor de "bonusvraag". - David Z
Voor degenen van de Redhat-kant van de wereld - apt-file search <> is het dichtst analoog aan dnf/yum whatprovides <>. - ffledgling


Er is ook een apt-bestand om bestanden op te zoeken in pakketten die niet zijn geïnstalleerd. Bijvoorbeeld:

apt-file list packagename

35
2017-07-30 08:49



precies wat ik zocht. bedankt - NES


U kunt zoeken in de inhoud van pakketten die zijn opgenomen in de verschillende Ubuntu-releases op de Ubuntu-pakketten website. Kijk onder het kopje "Doorzoek de inhoud van pakketten".

Hier zijn bijvoorbeeld de zoekresultaten voor 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





U bedoelt welk pakket en niet welke applicatie. De applicatie is uw pakketbeheerder, bijv. Software Center.

Gebruik makend van dpkg:

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

Voorbeeld

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

Gebruik makend van apt-file:

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

of ook mogelijk:

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

Voorbeeld

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

Of online hier, in de sectie Search the contents of packages.

enter image description here

Voorbeeld

enter image description here


10
2017-11-29 15:57



U bedoelt welk pakket en niet welke applicatie. De applicatie is uw pakketbeheerder, bijv. Software Center. Oke. Dank je! :) - ReyKev
Bedankt voor alle hulp! Geen van deze suggesties heeft me geholpen om te vinden welk pakket deze / deze toepassingen heeft geïnstalleerd. Alle zoekopdrachten leiden gewoon terug naar "Tracker". Ik vermoedde dat het Enthoughts 'Canopy wel was. Die lange EULA herinnerde me aan mijn oude Microsoft Windows-waas, waarmee ik zo blij ben dat ik er niet meer bij betrokken ben. Ik zag dat Tracker gisteren was geïnstalleerd, dus als root ben ik er vanaf gekomen, samen met Enthoughts 'Canopy en alle problemen zijn opgelost. Ik dank je echt voor al je hulp. Het is zo geweldig om dergelijke ondersteuning te hebben. Nogmaals bedankt! Kevin - ReyKev


Ik probeerde op te sporen wat er was geïnstalleerd which op mijn systeem. Na een beetje werk heb ik apt-whatprovides gemaakt

#!/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%:*}

Hoewel je voor de meeste dingen gewoon kunt gebruiken

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

2
2018-03-17 15:25



Alexx, ik ben dol op dit antwoord. Ik hoop dat je mijn bewerking niet erg vindt. Ik zorgde ervoor dat het ook werkte voor bestanden die niet op het systeem zijn geïnstalleerd. Ik maakte een back-up op gist.github.com/RichardBronosky/... en zal mijn eigen antwoord maken als je het terugzet / afwijst. - Bruno Bronosky
Update: Het voelt slijmerig om pasta dit antwoord te kopiëren en subtiele wijzigingen aan te brengen, maar mijn bewerking is afgewezen. Ik hoop dat je het gevoel hebt dat ik de integriteit van je antwoord heb behouden in mijn. - Bruno Bronosky
U kunt deze bewerken of hacken; alles dat het beter voor je maakt (daarom heb ik MIT-licentie toegevoegd! Ik heb zelfs geen tegoed nodig.) - Alexx Roche


Dit is een uitbreiding op Het uitstekende antwoord van Alexx Roche. Ik heb geprobeerd een bewerking op dat antwoord uit te voeren, maar het werd afgewezen (hoewel niet door Alexx)


Ik probeerde op te sporen wat er was geïnstalleerd which op mijn systeem. Na een beetje werk dat ik heb gemaakt /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}"

Hoewel je voor de meeste THINGS die zijn geïnstalleerd, gewoon kunt gebruiken:

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

Voor THING's die niet zijn geïnstalleerd, kunt u het volgende gebruiken:

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

De apt-whatprovides script werkt voor bestanden die wel en niet op uw systeem staan. Mijn systeem ontbrak bijvoorbeeld dig maar had ping dus dit is wat het resultaat was:

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

Let erop dat Searching for is een compleet pad voor ping (geïnstalleerd) en alleen de binaire naam voor dig niet geïnstalleerd. Dit heeft me geholpen ontdekken dat ik moest installeren dnsutilszonder dat je hoeft te zoeken https://packages.ubuntu.com/#search_contents


2
2017-07-18 05:45



Dit is zo'n goed antwoord dat ik de mijne moet verwijderen! - Alexx Roche


Een reden waarom je dit zou moeten doen is als je software compileert die al een ubuntu-pakket bevat, kun je het uitvoeren apt-get build-dep $PACKAGENAME. Dat zal alle pakketten installeren die je nodig hebt om te compileren $PACKAGENAME.


1
2017-08-11 19:31