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

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

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

601
задан 22 January 2014 в 06:20

9 ответов

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

Из man dpkg:

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

Пример:

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

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

Если вы хотите найти файлы, которые еще не установлены на вашем компьютере, вы можете использовать Ubuntu Packages Search
или apt-файл, как описано в другом ответе.

515
ответ дан 22 January 2014 в 06:20

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

Для установки apt-файла сделайте:

sudo apt-get install apt-file

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

sudo 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. У них есть возможность "искать содержимое пакетов" по определенному имени файла.

303
ответ дан 22 January 2014 в 06:20

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

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

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

19
ответ дан 22 January 2014 в 06:20

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

apt-file list packagename
48
ответ дан 22 January 2014 в 06:20

Вы означает, какой пакет, а не какое приложение. Приложение является вашим менеджером пакетов, например Центр программного обеспечения .

Использование 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-файла :

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

Или онлайн здесь , в разделе Поиск содержимого пакетов .

enter image description here

Пример

enter image description here

14
ответ дан 22 January 2014 в 06:20

Я пытался отследить, что установлено , что в моей системе. После небольшой работы я создал 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%:*}

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

apt-file search $(realpath $(which THING))|grep 'THING$'
3
ответ дан 22 January 2014 в 06:20

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

2
ответ дан 22 January 2014 в 06:20

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


Я пытался отследить, что установлено , что в моей системе. После небольшой работы я создал / 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}"

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

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

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

4
ответ дан 22 January 2014 в 06:20

Почему :

У разных дистрибутивов свой путь, слишком много команд, чтобы запомнить o (╥﹏╥) o

Как :

Универсальный решение: pacapt -Qo file_path

Результат :

На ubuntu:

$ pacapt -Qo /usr/bin/iostat
sysstat: /usr/bin/iostat

На centos:

$ pacapt -Qo /usr/bin/iostat
sysstat-10.1.5-19.el7.x86_64

Даже можно найти сам путь:

$ pacapt -Qo iostat
sysstat: /usr/share/man/man1/iostat.1.gz
sysstat: /usr/bin/cifsiostat
sysstat: /usr/bin/iostat
sysstat: /usr/share/man/man1/cifsiostat.1.gz

Что есть pacapt :

pacapt - это оболочка для многих менеджеров пакетов

Установите :

Просто загрузите переносимый скрипт :

wget -O $ HOME / bin / pacapt https: / /github.com/icy/pacapt/raw/ng/pacapt

0
ответ дан 5 January 2021 в 23:59

Другие вопросы по тегам:

Похожие вопросы: