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

468

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

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

Дэвид З
источник
6
Я всегда удивлялся этому сам - я знаю, что с помощью YUM вы можете сделать yum whatprovides <filepath> / <filename>, но я так и не нашел альтернативу этому в Aptitude, кроме веб-сайта Packages
Марко Чеппи
То же самое на SU: superuser.com/questions/10997/…
Сиро Сантилли,
Ни один из ответов здесь на самом деле не охватывает Provides:механизм. Более подробно, команда похожа mailxили sendmailне включена как двоичный файл в любой пакет; вместо этого различные пакеты устанавливают свои собственные двоичные файлы, а затем делают некоторые из них доступными под «каноническим» именем через /etc/alternatives. См. Также askubuntu.com/questions/366135/…
tripleee

Ответы:

439

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

От man dpkg:

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

Пример:

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

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

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

Ressu
источник
5
Я настоятельно рекомендую использовать dlocate, который обновляется ежедневно для более быстрого поиска.
Даниэль Т Чен
20
Подсказка: если вы не знаете полный путь, а просто имя команды, используйте, whichчтобы найти программу:dpkg -S `which firefox`
Lekensteyn
1
@DanielTChen, но dlocateможет не выполнять работу, если база данных dlocate устарела. Вы должны позвонить, sudo update-dlocatedbчтобы обновить его.
Ярно
2
Если dpkgточный путь ничего не возвращает (например dpkg /usr/bin/java), попробуйте только имя исполняемого файла (например dpkg java).
Дан Даскалеску
2
Вы можете также использовать realpathдля разрешения символических ссылок, например: dpkg -S $(realpath $(which <command>)).
Ларс Нистрем
238

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

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

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

apt-file list packagename
ptman
источник
17

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

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

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

moberley
источник
Это недавно просто возвращает ошибку.
Павел Веселов
13

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

введите описание изображения здесь

пример

введите описание изображения здесь

AB
источник
Вы имеете в виду, какой пакет, а не какое приложение. Приложение является вашим менеджером пакетов, например, Software Center. Хорошо. Спасибо! :)
РейКев
Спасибо за помощь! Ни одно из этих предложений не помогло мне найти пакет для установки этих / этих приложений. Все поиски просто ведут обратно в «Трекер». Я подозревал, что это был Навес Энтхофта все же. Это лицензионное соглашение длиной в милю напомнило мне о моем старом ошеломлении от Microsoft Windows, с которым я так рад, что больше не вовлечен Я видел, что Tracker был установлен вчера, поэтому, как root, я избавился от него вместе с Canopy от Enthoughts и все проблемы были решены. Я действительно благодарю вас за вашу помощь. Это так здорово иметь такую ​​поддержку. Еще раз спасибо! Кевин
РейКев
4

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

Бруно Броноски
источник
Это такой хороший ответ, что я должен удалить свой!
Алекс Роше
3

Я пытался отследить, что установлено 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$'
Алекс Рош
источник
1
Алекс, я люблю этот ответ. Надеюсь, вы не возражаете против моего редактирования. Я сделал это также для файлов, которые не установлены в системе. Я сделал резервную копию на gist.github.com/RichardBronosky/… и создам свой собственный ответ, если вы отмените или отклоните его.
Бруно Броноски
Обновление: Мне кажется скучным копировать этот ответ макаронами и вносить в него небольшие изменения, но мои изменения были отклонены. Я надеюсь, что вы чувствуете, что я сохранил целостность вашего ответа в моем .
Бруно Броноски
Не стесняйтесь редактировать или взломать; все, что делает его лучше для вас, (вот почему я добавил лицензию MIT! Мне даже не нужен кредит.)
Alexx Roche
2

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

Рори
источник