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

389

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

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

    
задан David Z 30.07.2010 в 08:10
источник

8 ответов

364

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

От man dpkg :

-S, --search filename-search-pattern...
                  Search for a filename from installed packages.

Пример:

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

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

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

    
ответ дан Ressu 30.07.2010 в 08:42
источник
191

Команда 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

Однако гораздо более дружелюбным способом является использование веб-сайта Ubuntu Packages Search . Они имеют возможность «искать содержимое пакетов» для определенного имени файла.

    
ответ дан jbowtie 11.08.2010 в 02:43
источник
36

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

apt-file list packagename
    
ответ дан ptman 30.07.2010 в 08:49
источник
16

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

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

Ссылка

    
ответ дан moberley 11.08.2010 в 02:42
источник
11

Вы имеете в виду, какой пакет, а не какое приложение. Приложение является вашим менеджером пакетов, например. 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 .

<ет>Пример

    
ответ дан A.B. 29.11.2015 в 15:57
источник
2

Я пытался отслеживать, что установлено 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 $@))
PACKAGE=$(apt-file search $BINARY|grep -E ":\s*${BINARY}$")
echo ${PACKAGE%:*}

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

apt-file search $(realpath $(which THING))|grep 'THING$'
    
ответ дан Alexx Roche 17.03.2018 в 15:25
источник
2

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

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

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

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

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

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

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

Обратите внимание, что Searching for - это полный путь для ping (установлен) и только двоичное имя для dig не установлено. Это помогло мне обнаружить, что мне нужно установить dnsutils без необходимости искать Ссылка

    
ответ дан Bruno Bronosky 18.07.2018 в 05:45
источник
1

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

    
ответ дан Rory 11.08.2010 в 19:31
источник

Ознакомьтесь с другими вопросами по меткам