Як знайти пакет, який надає файл?


466

Досить просте запитання: чи є якась команда оболонки (або метод GUI), яку я можу використовувати, враховуючи шлях до файлу в моїй системі, підказує, який пакет її туди помістив? Якщо припустити, що файл насправді походить з пакету, тобто.

Питання про бонус: що робити, якщо це файл, який не встановлений у моїй системі? Чи є, скажімо, веб-сайт, який дозволить мені шукати файл і бачити, які пакунки, якщо такі є, надають?


6
Мені завжди було цікаво про це - я знаю, що за допомогою YUM ви можете зробити щось, що забезпечує <filepath> / <ім'я файлу>, але я ніколи не знайшов альтернативу цьому в Aptitude, окрім веб-сайту «Пакети»
Марко Чеппі


Жодна з відповідей тут фактично не охоплює Provides:механізм. Дещо детальніше, команда, яка подобається mailxабо sendmailне входить як двійкова інформація в жодному пакеті; натомість різні пакети встановлюють власні бінарні файли, а потім роблять деякі з них доступними під "канонічним" ім'ям через /etc/alternatives. Дивіться також askubuntu.com/questions/366135/…
tripleee

Відповіді:


438

Ви можете скористатися dpkgкомандою, щоб дізнатися, який встановлений пакет має файл:

Від man dpkg:

-S, - шукати ім'я файлу-пошук-шаблон ...
                  Пошук імені файлу з встановлених пакетів.

Приклад:

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

Ви можете здійснювати пошук за допомогою повного шляху або лише з назвою файлу.

Якщо ви хочете шукати файли, які ще не встановлені на вашому комп’ютері, ви можете скористатися пошуком пакетів Ubuntu


5
Я настійно рекомендую використовувати dlocate, який оновлюється щодня для швидшого пошуку.
Даніель Т Чен

20
Підказка: якщо ви не знаєте повного шляху, а лише ім'я команди, використовуйте whichдля пошуку програми:dpkg -S `which firefox`
Lekensteyn

1
@DanielTChen, але dlocateне може виконати цю роботу, якщо база даних dlocate застаріла. Вам потрібно зателефонувати, sudo update-dlocatedbщоб оновити його.
jarno

2
Якщо dpkgточний шлях нічого не повертає (наприклад dpkg /usr/bin/java), спробуйте просто ім'я виконавця (наприклад dpkg java).
Дан Даскалеску

2
Ви можете також використовувати realpathдля вирішення символічних посилань, наприклад: dpkg -S $(realpath $(which <command>)).
Lars Nyström

236

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


21
На мою думку, це має бути прийнятою відповіддю. Але у відповідь на пошук пакетів Ubuntu , я можу стверджувати, що така проста програма оболонок є надзвичайно доброзичливою і легкою для запам'ятовування (як тільки ви це знаєте). Якщо ви використовуєте dpkg, apt-get або підхожість як свої стандартні інструменти, немає нічого доброзичливого в запуску Chrome для серфінгу в Інтернеті!
користувач2097818

3
@ user2097818 Причиною, що це не прийнята відповідь, є те, що моє основне питання обмежується файлами в системі та встановленими пакетами. apt-fileчасто знаходить помилкові позитиви, тобто пакети, які не встановлені. Звичайно, ця відповідь чудово підходить для "бонусного питання".
David Z

3
Для тих, хто з Redhat сторони світу - apt-file search <>це найближчий аналог dnf/yum whatprovides <>.
вівторок

Я відчув apt-file findсебе apt-findдавно, і це дуже зручно! Btw, останні версії вимагають root для apt-file update.
val

43

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

apt-file list packagename

17

Ви можете шукати вміст пакетів, що входять до різних версій Ubuntu, на веб-сайті пакунків Ubuntu . Подивіться під заголовком « Пошук вмісту пакунків ».

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

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


Це нещодавно лише повертає помилку.
Павло Веселов

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.

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

Приклад

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


Ви маєте на увазі, який пакет, а не який додаток. Додаток - менеджер пакунків, наприклад, Software Center. Добре. Дякую! :)
ReyKev

Дякую за всю допомогу! Жодна з цих пропозицій не допомогла мені знайти, в якому пакеті встановлено цей / ці програми. Усі пошукові запити повертаються до "Tracker". Я підозрював, що це Canopy Enthoughts. Ця миля EULA нагадала мені старий здимак Microsoft Windows, з яким я так радий, що більше не займаюся. Я побачив, що Tracker встановлений вчора, так що, як root, я позбувся його разом із навісом 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у моїй системі. Трохи попрацювавши, я створив пристосовані відомості

#!/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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.