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


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

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


370
2017-07-30 08:10


Источник


Я всегда задавался этим вопросом - я знаю, что с YUM вы можете сделать yum whatprovides <filepath> / <filename>, но я никогда не нашел альтернативы этому в Aptitude, кроме сайта Packages - Marco Ceppi♦
То же самое касается SU: superuser.com/questions/10997/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
Ни один из ответов здесь не охватывает Provides: механизм. В более подробной форме команда вроде mailx или sendmail не включается как двоичный код в Любые пакет; вместо этого различные пакеты устанавливают свои собственные двоичные файлы, а затем делают некоторые из них доступными под «каноническим» именем через /etc/alternatives, Смотрите также askubuntu.com/questions/366135/... - tripleee


Ответы:


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

Из man dpkg:

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

Пример:

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

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

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


348
2017-07-30 08:42



Я настоятельно рекомендую использовать dlocate, который обновляется ежедневно для более быстрого поиска. - Daniel T Chen
Подсказка: если вы не знаете полный путь, а просто имя команды, используйте which найти его программу: dpkg -S `which firefox` - Lekensteyn
Это работает и для библиотек, что особенно удобно, если у вас есть двоичный файл, который не будет запущен, потому что вы можете проверить его с помощью ldd и использовать полные пути библиотеки, чтобы найти пакеты, которые вам не хватает. - Alain O'Dea
@DanielTChen, но dlocate может не выполнять эту работу, если база данных dlocate устарела. Вы должны позвонить sudo update-dlocatedb для его обновления. - jarno
Если dpkg точный путь ничего не возвращает (например, dpkg /usr/bin/java), попробуйте просто имя исполняемого файла (например, dpkg java). - Dan Dascalescu


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 Веб-сайт. Они имеют возможность «искать содержимое пакетов» для определенного имени файла.


180
2017-08-11 02:43



По-моему, это должен быть принятый ответ. Но в ответ на Поиск пакетов Ubuntu, Я могу утверждать, что программа оболочки эта простая чрезвычайно дружелюбна и легко запоминается (как только вы это знаете). Если вы используете dpkg, apt-get или aptitude в качестве стандартных инструментов, нет ничего дружего в том, чтобы запускать Chrome для работы в Интернете! - user2097818
@ user2097818 Причина, по которой это не принятый ответ, заключается в том, что мой основной вопрос ограничен файлами в системе и установленными пакетами. apt-file часто находит ложные срабатывания, то есть пакеты, которые не установлены. Конечно, этот ответ отлично подходит для «бонусного вопроса». - David Z
Для тех, кто со стороны Redhat мира - apt-file search <> является ближайшим аналогом dnf/yum whatprovides <>, - ffledgling


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

apt-file list packagename

32
2017-07-30 08:49



именно то, что я искал. благодаря - NES


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

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

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


16
2017-08-11 02:42





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


10
2017-11-29 15:57



Вы имеете в виду, какой пакет, а не какое приложение. Приложение является вашим менеджером пакетов, например. Центр программного обеспечения. Хорошо. Спасибо! :) - ReyKev
Спасибо вам за помощь! Ни одно из этих предложений не помогло мне найти, какой пакет установил эти / эти приложения. Все поисковые запросы просто вернутся к «Tracker». Я подозревал, что это Canopy Enthoughts. Эта миля EULA напомнила мне мой старый озорник Microsoft Windows, с которым я так рад, что больше не участвую. Я видел, что Tracker был установлен вчера, поэтому, как root, я избавился от него, вместе с Canopy Enthoughts и все проблемы решены. Я действительно благодарю вас за вашу помощь. Это такая хорошая вещь, чтобы иметь такую ​​поддержку. Еще раз спасибо! Kevin - ReyKev


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

2
2018-03-17 15:25



Алекс, мне нравится этот ответ. Надеюсь, вы не возражаете против моего редактирования. Я сделал это также для файлов, которые не установлены в системе. Я сделал резервную копию на gist.github.com/RichardBronosky/... и создаст мой собственный ответ, если вы вернете / отклоните его. - Bruno Bronosky
Обновление. Слишком сложно копировать макароны с этим ответом и делать тонкие изменения, но мое редактирование было отклонено. Надеюсь, вы чувствуете, что я поддерживал целостность вашего ответа в моем, - Bruno Bronosky
Не стесняйтесь редактировать или взламывать; все, что делает его лучше для вас (вот почему я добавил лицензию MIT! Мне даже не нужен кредит). - Alexx Roche


Это расширение Отличный ответ 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без необходимости искать https://packages.ubuntu.com/#search_contents


2
2017-07-18 05:45



Это такой хороший ответ, что я должен удалить мою! - Alexx Roche


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


1
2017-08-11 19:31