How do I find the package that provides a file?
Simple enough question: is there some shell command (or GUI method) I can use that, given the path to a file on my system, tells me what package put it there? Assuming the file did in fact come from a package, that is. Bonus question: what if it’s a file that isn’t installed on my system? Is there, say, a website that will let me look up a file and see what packages, if any, provide it?
I’ve always wondered this myself — I know with YUM you can do yum whatprovides
None of the answers here actually cover the Provides: mechanism. In some more detail, a command like mailx or sendmail is not included as a binary in any package; instead, various packages install their own binaries and then make some of them available under a «canonical» name via /etc/alternatives . See also askubuntu.com/questions/366135/…
10 Answers 10
You can use dpkg command to find out which installed package owns a file:
-S, --search filename-search-pattern. Search for a filename from installed packages.
$ dpkg -S /bin/ls coreutils: /bin/ls
You can either search with a full path or with just the filename.
If you wish to search for files not yet installed on your computer, you can use the Ubuntu Packages Search, or apt-file as described in a different answer.
Hint: if you do not know the full path, but just the command name, use which to find he program: dpkg -S `which firefox`
@DanielTChen, but dlocate may not do the job, if dlocate’s database is out of date. You have to call sudo update-dlocatedb to update it.
If dpkg the exact path doesn’t return anything (e.g. dpkg /usr/bin/java ), try just the executable’s name (e.g. dpkg java ).
The apt-file command can do this for you from the command line. I use it frequently when building packages from source. For files provided by packages that are already installed on your system, apt-cache is another choice.
sudo apt-get install apt-file
Then, you need to update it’s database:
And, finally, search the file:
$ apt-file find kwallet.h kdelibs5-dev: /usr/include/kwallet.h libkf5wallet-dev: /usr/include/KF5/KWallet/kwallet.h
However a much friendlier way is to use the Ubuntu Packages Search website. They have an option to «search the contents of packages» for a specific filename.
In my opinion this should be the accepted answer. But in response to Ubuntu Packages Search, I might argue that a shell program this simple is extremely friendly and easy to remember (once you know it). If you use dpkg, apt-get, or aptitude as your standard tools, there is nothing friendly about firing up Chrome to surf the internet!
@user2097818 The reason this isn’t the accepted answer is that my primary question is restricted to files on the system and packages which are installed. apt-file often finds false positives, i.e. packages that aren’t installed. Of course this answer is great for the «bonus question».
For those from the Redhat side of the world — apt-file search <> is the closest analog to dnf/yum whatprovides <> .
I guess the question is why in the world is this functionality not built into apt , apt-get , or one of the other default apt-* programs. It seems like key piece of any package manager’s search capabilities.
A couple of caveats: 1) you have to install apt-file which is really annoying; 2) it is much slower than dpkg -S, eg on my system the latter takes less than half a second, whereas apt-file find takes 20 seconds! 3) most often, if you have a path on your system, then the package is installed, so why pay for the overhead of apt-file?
There’s also apt-file for looking up files in packages that aren’t installed. For example:
You can search the contents of packages included in the various Ubuntu releases on the Ubuntu Packages website. Look under the heading «Search the contents of packages».
For example, here are the search results for libnss3.so in focal (20.04):
You mean, which package and not which application. The application is your package manager, e.g. Software Center .
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 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
Or online here, in the section Search the contents of packages .
You mean, which package and not which application. The application is your package manager, e.g. Software Center. Okay. Thank you! 🙂
Thank you for all the help! None of these suggestions helped me find which package installed this/these applications though. All searches just lead back to «Tracker». I suspected it was Enthoughts’ Canopy though. That mile long EULA reminded me of my old Microsoft Windows daze, with which, I am so glad I am no longer involved. I saw that Tracker was installed yesterday so, as root, I got rid of it, along with Enthoughts’ Canopy and, all problems are solved. I really thank you for all your help. It is such a great thing to have such support. Thanks again! Kevin
This is an extension to Alexx Roche’s excellent answer. I tried to make an edit to that answer, but it got rejected (though not by Alexx)
I was trying to track down what installed which on my system. After a little work I created /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]$$")" echo "$"
Though for most THINGs that are installed you can just use:
apt-file search $(realpath $(which THING)) | grep 'THING$'
For THINGs that are not installed, you can use:
apt-file search THING | grep '/THING$'
The apt-whatprovides script works for files that are and are not on your system. For example, my system lacked dig but had ping so this it what resulted:
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
Как в Linux узнать, в каком пакете содержится файл
Если вы компилируете программы из исходных кодов, то вы, наверняка, сталкивались с ошибками компиляции, когда программа не находит какой-либо файл и компиляция обрывается. Что делать в данной ситуации? Понятно, что нужно установить пакет, который содержит требуемый файл. Но как узнать имя этого пакета?
Вполне возможно, что вас выручит Гугл, достаточно в строке поиска набрать что-нибудь вроде fatal error: ffi.h и уже в первых результатах поиска вы найдёте сайты с ответом на ваш вопрос. Это не самый хороший способ, поскольку:
- если постоянно надеяться только на Google, то в конце-концов он подведёт;
- обычно ссылки ведут нас на англоязычные сайты — а с иностранными языками в РФ так себе;
- ну и, в конце-концов, это просто нубство.
В этой заметке я расскажу о нескольких способах узнать имя пакета, содержащего требуемый файл.
apt-file
Эта программа предназначена для поиска файлов в пакетах. Также она может показать все файлы в пакете.
sudo apt-get install apt-file
Сразу после установки кэш данных о программах пуст. Чтобы его обновить нужно выполнить команду (можно выполнять как от рута, так и от пользователя):
Когда всё готово, то поиск осуществляется так:
К примеру я ищу файл ffi.h:
Как можно увидеть файл найден, но кроме него ещё и много лишнего:
На помощь можно призвать умные регулярные выражения, к примеру в следующей строке замените ffi.h на тот файл, который вы ищите — и вы всегда будете получать самый точный результат:
t=ffi.h; apt-file search $t | grep -E "/$t$"
Ну и для любителей графического интерфейса, вот вам от меня графический интерфейс:
FILE=`/usr/bin/zenity --entry --width=300 —title="Нахождения пакета по файлу" --text="Пожалуйста, введите название файла:"`; if [ $? -eq 1 ]; then exit -1; fi; apt-file search $FILE | grep -E "/$FILE$" | zenity --text-info --width 530 --height 350
Справка по команде apt-file
apt-file [опции] действие [образец] apt-file [опции] -f действие apt-file [опции] -D действие Configuration options: --architecture -a Использовать определённую архитектуру --cache -c Директория кэша --cdrom-mount -d Использовать особую точку монтирования cdrom --dummy -y запустить в фиктивном режиме (без действий) --fixed-string -F Не расширять шаблон --from-deb -D Использовать файловый список .deb пакета(ов) как шаблон; подразумевает -F --from-file -f Прочитать шаблон из файла(ов), один на строку (используйте '-' для стандартного ввода) --ignore-case -i Игнорировать различия регистра --non-interactive -N Пропустить схемы, требующие ввода пользователя (полезно в работах cron) --package-only -l Показать только имя пакета --regexp -x образец — это регулярное выражение --sources-list -s расположение sources.list --verbose -v запустить в вербальном режиме --help -h Показать справку. -- Конец опций (требуется если образец начинается с '-') Действия: update Извлечь информацию оглавлений файлов из apt-sources. search|find Поиск файлов в пакете list|show Список файлов в пакете purge Удалить файлы кэша
whichpkg
whichpkg — это единая оболочка для управления пакетами в Debian. Она является обёрткой вокруг apt, apt-cache, dpkg, aptitude и других. Её цель — простое управление пакетами из одного интерфейса путём унификации главных функций этих инструментов.
sudo apt-get install wajig
wajig wajig> whichpkg ffi.h INSTALLED MATCHES (x2) ---------------------- libffi-dev:amd64: /usr/share/doc/libffi6/html/Using-libffi.html libffi-dev:amd64: /usr/include/x86_64-linux-gnu/ffi.h UNINSTALLED MATCHES (x13) ------------------------- watobo: /usr/share/watobo/rvm/gems/ruby-2.0.0-p643/gems/ffi-1.9.10/ext/ffi_c/libffi/include/ffi.h.vc64 libffi-dev: /usr/share/doc/libffi6/html/Using-libffi.html pypy-doc: /usr/share/doc/pypy-doc/html/rffi.html chipmunk-dev: /usr/include/chipmunk/chipmunk_ffi.h watobo: /usr/share/watobo/rvm/gems/ruby-2.0.0-p643/gems/ffi-1.9.10/ext/ffi_c/libffi/include/ffi.h.vc ghc-doc: /usr/share/doc/ghc-doc/html/users_guide/ffi.html watobo: /usr/share/watobo/rvm/gems/ruby-2.0.0-p643/gems/ffi-1.9.10/ext/ffi_c/libffi/include/ffi.h.in jython-doc: /usr/share/doc/jython-doc/html/javadoc/org/python/modules/jffi/jffi.html mlton-basis: /usr/lib/mlton/include/basis-ffi.h watobo: /usr/share/watobo/rvm/gems/ruby-2.0.0-p643/gems/ffi-1.9.10/ext/ffi_c/rbffi.h libgirepository1.0-dev: /usr/include/gobject-introspection-1.0/girffi.h pypy-doc: /usr/share/doc/pypy-doc/html/config/objspace.usemodules._rawffi.html libffi-dev: /usr/include/x86_64-linux-gnu/ffi.h wajig>
Как видно, показаны совпадения в установленных и в неустановленных пакетах. НО мой предыдущий фокус с фильтрацией командой grep здесь не работает.
Как и положено быть унифицированному интерфейсу, у этой команды огромное количество опций и есть встроенный урок по использованию. Но их рассмотрение выходит за рамки этой заметки.
auto-apt
Программа auto-apt предназначена для поиска пакетов по файлу и установке пакетов по требованию.
Инструмент auto-apt проверяет доступ к файлам запущенными программами внутри своего окружения, и если программа пытается получить доступ к файлу про который известно, что он принадлежит к неустановленному пакету, то auto-apt установит этот пакет используя apt-get. Эта функция требует рабочих apt и sudo.
Программа также имеет простую базу данных для поиска пакета, содержащего требуемый файл.
sudo apt-get install auto-apt
После установки нужно обновить список пакетов следующей командой:
Лично у меня программа не сработала ни на одной из двух систем (на одной не смогла полностью загрузить файлы с содержанием пакетов, как следствие — поиск ничего не нашёл, на другой системе программа вообще ничего не стала загружать).
dlocate
dlocate является альтернативой dpkg -L и dpkg -S. Её преимуществом является более быстрый поиск, разные дополнительные функции вроде подсчёта занимаемого места, но… она ищет только по установленным пакетам — т. е. для целей, которые озвучены в начале заметки она неприменима.
sudo apt-get install dlocate
dlocate -S ffi.h libffi-dev:amd64: /usr/share/doc/libffi6/html/Using-libffi.html libffi-dev:amd64: /usr/include/x86_64-linux-gnu/ffi.h
Заключение
Теперь, когда при очередной компиляции возникнет очередная ошибка из-за отсутствующего файла, вам не обязательно открывать Гугл и читать англоязычные форумы. Одной командой прямо в командной строке вы можете найти требуемый пакет.