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

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

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

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

От man dpkg:

-S, --поиск имени файла-поиск-шаблон...                  Найдите имя файла в установленных пакетах.

Пример:

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

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

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

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

Устанавливать apt-file, сделай:

sudo apt-get install apt-file

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

sudo apt-file update

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

$ apt-file find kwallet.hkdelibs5-dev: /usr/include/kwallet.hlibkf5wallet-dev: /usr/include/KF5/KWallet/kwallet.h

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

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

apt-file list packagename

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

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

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

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

С помощью dpkg:

dpkg -S /usr/lib/tracker/tracker-storedpkg -S tracker-extractdpkg -S tracker-miner-fs

Пример

% dpkg -S /usr/lib/tracker/tracker-storetracker: /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-storetracker: /usr/lib/tracker/tracker-store

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

enter image description here

Пример

enter image description here

Это дополнение к Отличный ответ Алекса Роша. Я попытался внести правку в этот ответ, но это было отклонено (хотя и не от 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 $BINARYPACKAGE="$(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 pingSearching for /bin/pinginetutils-ping: /bin/pingiputils-ping: /bin/pingpi@raspberrypi:~ $ apt-whatprovides digSearching for digdnsutils: /usr/bin/digepic4: /usr/share/epic4/script/digepic4-help: /usr/share/epic4/help/8_Scripts/digknot-dnsutils: /usr/bin/dig

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

Я пытался отследить, что установлено 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%:*}

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

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

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

Почему?:

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

Как:

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

Исход:

На ubuntu:

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

На centos:

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

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

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

Что является пакапт:

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

Устанавливать:

Просто скачайте переносимый скрипт:

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

Вы можете использовать apt чтобы сделать это.

$ apt contains /bin/lscoreutils: /bin/ls

Результат такой же, как:

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

I’ve always wondered this myself - I know with YUM you can do yum whatprovides /

Ни один из приведенных здесь ответов на самом деле не охватывает механизм Обеспечивает:. Более подробно, команда типа mailx или sendmail не включена в качестве двоичного файла в * любой * пакет; вместо этого различные пакеты устанавливают свои собственные двоичные файлы, а затем делают некоторые из них доступными под “каноническим” именем через /etc/alternatives. Смотрите также How to search for packages that provides a virtual package? - Ask Ubuntu

То же самое на SU: Find what package a file belongs to in Ubuntu/Debian? - Super User