Jak znaleźć pakiet, który zawiera plik?

466

Proste pytanie: czy jest jakieś polecenie powłoki (lub metoda GUI), którego mogę użyć, biorąc pod uwagę ścieżkę do pliku w moim systemie, mówi mi, który pakiet go tam umieścił? Zakładając, że plik faktycznie pochodzi z pakietu, to znaczy.

Dodatkowe pytanie: co jeśli jest to plik, który nie jest zainstalowany w moim systemie? Czy istnieje, powiedzmy, strona internetowa, która pozwoli mi wyszukać plik i zobaczyć, jakie pakiety go dostarczają?

David Z
źródło
6
Zawsze zastanawiałem się nad tym sam - wiem, że dzięki YUM możesz zrobić yum, co zapewnia <ścieżka pliku> / <nazwa pliku>, ale tak naprawdę nigdy nie znalazłem alternatywy dla Aptitude innej niż strona Pakiety
Marco Ceppi
To samo na SU: superuser.com/questions/10997/…
Ciro Santilli 21 改造 中心 法轮功 六四 事件
Żadna z odpowiedzi tutaj nie obejmuje Provides:mechanizmu. W niektórych bardziej szczegółowo, polecenie jak mailxi sendmailnie zawiera jako binarny w każdym opakowaniu; zamiast tego różne pakiety instalują własne pliki binarne, a następnie udostępniają niektóre z nich pod nazwą „kanoniczną” za pośrednictwem /etc/alternatives. Zobacz także askubuntu.com/questions/366135/…
tripleee

Odpowiedzi:

438

Możesz użyć dpkgpolecenia, aby dowiedzieć się, który zainstalowany pakiet jest właścicielem pliku:

Od man dpkg:

-S, - wyszukaj wzorzec nazwy pliku ...
                  Wyszukaj nazwę pliku z zainstalowanych pakietów.

Przykład:

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

Możesz wyszukiwać pełną ścieżką lub tylko nazwą pliku.

Jeśli chcesz wyszukać pliki, które nie zostały jeszcze zainstalowane na komputerze, możesz skorzystać z wyszukiwania pakietów Ubuntu

Ressu
źródło
5
Zdecydowanie polecam użycie dlocate, który jest aktualizowany codziennie w celu szybszego wyszukiwania.
Daniel T Chen,
20
Wskazówka: jeśli nie znasz pełnej ścieżki, a jedynie nazwę polecenia, użyj go, whichaby znaleźć program:dpkg -S `which firefox`
Lekensteyn
1
@DanielTChen, ale dlocatemoże nie wykonać zadania, jeśli baza danych dlocate jest nieaktualna. Musisz zadzwonić, sudo update-dlocatedbaby go zaktualizować.
jarno
2
Jeśli dpkgdokładna ścieżka niczego nie zwraca (np. dpkg /usr/bin/java), Wypróbuj tylko nazwę pliku wykonywalnego (np dpkg java.).
Dan Dascalescu
2
Można również użyć realpath, aby rozwiązać dowiązania, tak: dpkg -S $(realpath $(which <command>)).
Lars Nyström
236

apt-filePolecenie może zrobić dla ciebie z linii poleceń. Używam go często podczas budowania pakietów ze źródła. Dla plików dostarczanych przez pakiety, które są już zainstalowane w twoim systemie, apt-cachejest inny wybór.

Aby zainstalować apt-file:

sudo apt-get install apt-file

Następnie musisz zaktualizować bazę danych:

apt-file update

I na koniec wyszukaj plik:

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

Jednak znacznie łatwiejszym sposobem jest skorzystanie z witryny wyszukiwania pakietów Ubuntu . Mają opcję „przeszukiwania zawartości pakietów” w celu znalezienia określonej nazwy pliku.

jbowtie
źródło
21
Moim zdaniem powinna to być zaakceptowana odpowiedź. Ale w odpowiedzi na wyszukiwanie pakietów Ubuntu mogę argumentować, że tak prosty program powłoki jest wyjątkowo przyjazny i łatwy do zapamiętania (gdy go znasz). Jeśli używasz dpkg, apt-get lub aptitude jako standardowych narzędzi, nie ma nic przyjaznego w uruchamianiu Chrome do surfowania po Internecie!
user2097818
3
@ user2097818 Powodem, dla którego nie jest to akceptowana odpowiedź, jest to, że moje podstawowe pytanie jest ograniczone do plików w systemie i zainstalowanych pakietów. apt-fileczęsto znajduje fałszywe alarmy, tzn. pakiety, które nie są zainstalowane. Oczywiście ta odpowiedź jest świetna w przypadku „pytania bonusowego”.
David Z
3
Dla osób ze strony Redhat na świecie - apt-file search <>to najbliższy analog dnf/yum whatprovides <>.
sfledgling
Alias apt-file findjuż apt-finddawno temu i to naprawdę przydatne! Btw, najnowsze wersje wymagają rootowania apt-file update.
val
43

Istnieje również apt-file do wyszukiwania plików w niezainstalowanych pakietach. Na przykład:

apt-file list packagename
ptman
źródło
13

Masz na myśli, który pakiet, a nie jaką aplikację. Aplikacja jest Twoim menedżerem pakietów, np Software Center.

Używanie dpkg:

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

Przykład

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

Używanie apt-file:

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

lub też możliwe:

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

Przykład

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

Lub online tutaj , w sekcji Search the contents of packages.

wprowadź opis zdjęcia tutaj

Przykład

wprowadź opis zdjęcia tutaj

AB
źródło
Masz na myśli, który pakiet, a nie jaką aplikację. Aplikacja jest Twoim menedżerem pakietów, np. Software Center. W porządku. Dziękuję Ci! :)
ReyKev
Dziękuję za całą pomoc! Żadna z tych sugestii nie pomogła mi jednak ustalić, który pakiet zainstalował tę / te aplikacje. Wszystkie wyszukiwania prowadzą tylko do „Tracker”. Podejrzewałem jednak, że to baldachim Enthoughtsa. Ta długa na milę umowa EULA przypomniała mi moje stare oszołomienie Microsoft Windows, z którym tak się cieszę, że nie jestem już zaangażowany. Widziałem, że Tracker został zainstalowany wczoraj, więc jako root pozbyłem się go wraz z baldachimem Enthoughts i wszystkie problemy zostały rozwiązane. Naprawdę dziękuję za twoją pomoc. Wspaniale jest mieć takie wsparcie. Dzięki jeszcze raz! Kevin
ReyKev
4

To rozszerzenie doskonałej odpowiedzi Alexx Roche . Próbowałem dokonać edycji tej odpowiedzi, ale została ona odrzucona (choć nie przez Alexx)


Próbowałem wyśledzić, co zainstalowałem whichw moim systemie. Po małej pracy, którą stworzyłem/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}"

Chociaż w większości zainstalowanych RZECZY możesz po prostu użyć:

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

W RZECZY, które nie są zainstalowane, możesz użyć:

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

apt-whatprovidesSkrypt działa dla plików, które nie są w systemie. Na przykład mój system nie digmiał, ale miał pingto, co spowodowało:

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

Zauważ, że Searching forjest to pełna ścieżka dla ping(zainstalowanej) i tylko nazwa binarna dla digniezainstalowanej. To pomogło mi odkryć, że muszę zainstalować dnsutilsbez konieczności wyszukiwania w https://packages.ubuntu.com/#search_contents

Bruno Bronosky
źródło
To jest tak dobra odpowiedź, że powinienem usunąć moją!
Alexx Roche
3

Próbowałem wyśledzić, co zainstalowałem whichw moim systemie. Po krótkiej pracy stworzyłem 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%:*}

Chociaż w większości RZECZY możesz po prostu użyć

apt-file search $(realpath $(which THING))|grep 'THING$'
Alexx Roche
źródło
1
Alexx, uwielbiam tę odpowiedź. Mam nadzieję, że nie masz nic przeciwko mojej edycji. Sprawiłem, że działa również dla plików, które nie są zainstalowane w systemie. Zrobiłem kopię zapasową na gist.github.com/RichardBronosky/... i utworzę własną odpowiedź, jeśli ją cofniesz / odrzucisz .
Bruno Bronosky
Aktualizacja: Czuję się podle, gdy kopiuję makaron i wprowadzam w nim subtelne zmiany, ale moja edycja została odrzucona. Mam nadzieję, że czujesz, że zachowałem uczciwość twojej odpowiedzi w mojej .
Bruno Bronosky
Możesz edytować lub hakować; wszystko, co sprawia, że ​​jest to dla ciebie lepsze (dlatego dodałem licencję MIT! Nawet nie potrzebuję kredytu.)
Alexx Roche 30'18
2

Jednym z powodów, dla których możesz to zrobić, jest to, że jeśli kompilujesz oprogramowanie, które już zawiera pakiet ubuntu, możesz uruchomić apt-get build-dep $PACKAGENAME. Spowoduje to zainstalowanie wszystkich pakietów, które musisz skompilować $PACKAGENAME.

Rory
źródło