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

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

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

10 ответов

Решение

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

От man dpkg:

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

Пример:

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

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

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

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

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

apt-file list packagename

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

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

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

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

пример

Это продолжение отличного ответа Алекса Роша. Я попытался отредактировать этот ответ, но он был отклонен (хотя не 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}"

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

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 без необходимости идти поиск https://packages.ubuntu.com/

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

      $ apt contains /bin/ls
coreutils: /bin/ls

Вывод такой же, как:

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

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

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