it-swarm.com.ru

Как мне найти пакет, который предоставляет файл?

Достаточно простой вопрос: есть ли какая-нибудь команда Shell (или метод с графическим интерфейсом), которую я могу использовать, учитывая путь к файлу в моей системе, и говорит мне, какой пакет поместил туда? Предполагая, что файл действительно пришел из пакета, то есть.

Дополнительный вопрос: что если это файл, который не установлен в моей системе? Есть, скажем, веб-сайт, который позволит мне найти файл и посмотреть, какие пакеты, если таковые имеются, предоставляют его?

446
David Z

Вы можете использовать команду dpkg, чтобы узнать, какому установленному пакету принадлежит файл:

От man dpkg:

 - S, --search filename-search-pattern ... 
 Поиск имени файла из установленных пакетов. 

Пример:

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

Вы можете искать либо по полному пути, либо по имени файла.

Если вы хотите искать файлы, которые еще не установлены на вашем компьютере, вы можете использовать Поиск пакетов Ubunt

413
Ressu

Команда apt-file может сделать это для вас из командной строки. Я часто использую его при сборке пакетов из исходного кода. Для файлов, предоставляемых пакетами, которые уже установлены в вашей системе, apt-cache - другой выбор.

Чтобы установить apt-file, выполните:

Sudo apt-get install apt-file

Затем вам нужно обновить базу данных:

apt-file update

И, наконец, поиск файла:

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

Однако гораздо более удобный способ - использовать сайт Поиск пакетов Ubunt . У них есть возможность "искать содержимое пакетов" по ​​конкретному имени файла.

226
jbowtie

Также есть apt-файл для поиска файлов в пакетах, которые не установлены. Например:

apt-file list packagename
43
ptman

Вы можете искать содержимое пакетов, включенных в различные выпуски Ubuntu, на сайте buntu Packages . Посмотрите под заголовком " Поиск содержимого пакетов ".

Например, вот результаты поиска для libnss3.so в lucid (10.04):

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

17
moberley

Вы имеете в виду, какой пакет, а не какое приложение. Приложение является вашим менеджером пакетов, например Software Center.

Использование dpkg:

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

Пример

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

Использование apt-file:

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

или также возможно:

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

Пример

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

Или онлайн здесь , в разделе Search the contents of packages.

enter image description here

Пример

enter image description here

13
A.B.

Это расширение к отличный ответ Алекса Роша . Я попытался отредактировать этот ответ, но он был отклонен (хотя не Alexx)


Я пытался отследить, что установлено which в моей системе. После небольшой работы я создал /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 [email protected]) 2>/dev/null)"
[ -z "$BINARY" ] && BINARY="[email protected]"
echo Searching for $BINARY
PACKAGE="$(apt-file search $BINARY|grep -E ":.*[^-.a-zA-Z0-9]${BINARY}$")"
echo "${PACKAGE}"

Хотя для большинства установленных вещей вы можете просто использовать:

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

Для вещей, которые не установлены, вы можете использовать:

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

Сценарий apt-whatprovides работает для файлов, которые есть и не находятся в вашей системе. Например, моей системе не хватало Dig, но было ping, так что это привело к следующему:

[email protected]:~ $ apt-whatprovides ping
Searching for /bin/ping
inetutils-ping: /bin/ping
iputils-ping: /bin/ping

[email protected]:~ $ 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

Обратите внимание, что Searching for - это полный путь к ping (установлен), а просто двоичное имя для Dig не установлено. Это помогло мне понять, что мне нужно установить dnsutils без необходимости искать https://packages.ubuntu.com/#search_contents

3
Bruno Bronosky

Я пытался отследить, что установлено which в моей системе. После небольшой работы я создал apt-whatprovides

#!/bin/sh
#apt-whatprovides ver. 201801010101 Copyright alexx, MIT Licence
#rdfa:deps="[realpath,apt-file,grep,which,sh,echo]"

BINARY=$(realpath $(which [email protected]))
PACKAGE=$(apt-file search $BINARY|grep -E ":\s*${BINARY}$")
echo ${PACKAGE%:*}

Хотя для большинства вещей вы можете просто использовать

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

Одна из причин, по которой вам, возможно, придется это сделать, - если вы компилируете программное обеспечение, в котором уже есть пакет ubuntu, вы можете запустить apt-get build-dep $PACKAGENAME. Это установит все пакеты, необходимые для компиляции $PACKAGENAME.

2
Rory