- Как узнать, к какому пакету принадлежит определенный файл
- APT: Debian, Ubuntu и производные
- RPM: Red Hat, Fedora и производные
- Pacman: Arch и производные
- Как в Linux узнать, в каком пакете содержится файл
- apt-file
- whichpkg
- auto-apt
- dlocate
- Заключение
- Связанные статьи:
- Какому пакету принадлежит файл в Linux
- Узнаем какому пакету принадлежит файл в dpkg
- Как узнать имя пакета по файлу в apt-file
- Узнаем какому пакету принадлежит файл в rpm
- Какому пакету принадлежит файл в Arch Linux
- Поиск пакета по файлу в Gentoo
- Выводы
- How do I find out which package owns a file?
- Installing and using apt-file
Как узнать, к какому пакету принадлежит определенный файл
Или хуже: как исправить классику конфликт зависимости«файл X уже установлен«? Для этого необходимо открыть какой пакет содержит рассматриваемый файл. Как это сделать? Ха! Заходи и узнай .
Некоторое время назад мы видели как это сделать на Debian, Ubuntu и производных. Теперь посмотрим, как это делается и в остальных дистрибутивах.
APT: Debian, Ubuntu и производные
Те дистрибутивы, которые используют APT, могут использовать APT-файл.
sudo apt-get установить apt-файл
После установки он работает так:
поиск apt-файла / путь / файл
Где / path / file — это путь к файлу, который вы ищете.
RPM: Red Hat, Fedora и производные
Вам нужно только выполнить следующую команду:
Где / path / file — это путь к файлу, который вы ищете.
Pacman: Arch и производные
В Arch вам нужно только использовать всемогущего Pacman:
pacman -Qo /usr/lib/gtk-2.0/2.10.0/engines/libmist.so
/usr/lib/gtk-2.0/2.10.0/engines/libmist.so принадлежит gtk-engine 2.20.2-1
Также можно использовать pkgfile. Вам нужно только установить его:
Где файл — это имя файла, который вы ищете.
Содержание статьи соответствует нашим принципам редакционная этика. Чтобы сообщить об ошибке, нажмите здесь.
Полный путь к статье: Из Linux » ФайлДавайте использовать Linux » Как узнать, к какому пакету принадлежит определенный файл
Как в 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
Заключение
Теперь, когда при очередной компиляции возникнет очередная ошибка из-за отсутствующего файла, вам не обязательно открывать Гугл и читать англоязычные форумы. Одной командой прямо в командной строке вы можете найти требуемый пакет.
Связанные статьи:
Какому пакету принадлежит файл в Linux
В этой краткой заметке я хочу рассказать как узнать какому пакету принадлежит файл Linux, мы рассмотрим как решить эту задачу не только в Ubuntu, но и в других популярных дистрибутивах. Такая задача возникает очень редко. Например, вы чистите систему, увидели странный файл, или файл который занимает много места и хотите узнать какому пакету он принадлежит, и вообще, нужен ли он здесь. Или другая ситуация вы хотите установить или удалить программу но не помните название пакета, но знаете как называется исполняемый файл.
Для получения такой информации в Ubuntu есть несколько способов. Это стандартная утилита dpkg, которая работает только с существующими файлами, а также инструмент apt-file, позволяющий получить название программы зная имя исполняемого файла. Подобные инструменты есть и для других дистрибутивов.
Узнаем какому пакету принадлежит файл в dpkg
Для того чтобы узнать какому пакету принадлежит файл dpkg имеет опцию -S, правда, выведено будет только имя пакета и адрес файла, например:
Теперь если хотим получить информацию о пакете, используем опцию -s:
Или объедением эти команды:
dpkg -S /usr/bin/cloud | awk -F: » | xargs dpkg -s
Как узнать имя пакета по файлу в apt-file
Утилита apt-file не является стандартной для системы Ubuntu, поэтому сначала ее нужно установить:
Затем нужно обновить базу данных программы, при обновлении загрузиться около 30 Мегабайт данных:
Теперь можно использовать:
apt-file search /usr/bin/ncdu
Узнаем какому пакету принадлежит файл в rpm
В системах на базе Red Hat Linux тоже можно выполнить аналогичное действие. Здесь вместо dpkg используется консольная утилита rpm. Для получения информации о пакетах используется опция -q, если комбинировать ее с опцией -f и передать адрес файла, мы сможем узнать какому пакету принадлежит файл:
Хотите более подробной информации о пакете, добавьте опцию -i:
Пакетный менеджер yum, используемый в системах, основанных на Red Hat, тоже умеет искать пакеты по файлу, для этого есть команда whatpovides:
Какому пакету принадлежит файл в Arch Linux
ArchLinux использует собственный менеджер пакетов, очень сильно отличающийся от описанных выше. Но здесь тоже можно сделать то, что нам нужно. Для этого есть опция -Qo:
Но этот способ работает только для установленных пакетов, если пакет не установлен, можно использовать утилиту pkgfile. Она не поставляется по умолчанию, но ее можно установить:
Теперь посмотрим какому пакету принадлежит /bin/evince:
Теперь вы можете узнать из какого пакета можно получить нужную вам программу.
Поиск пакета по файлу в Gentoo
Еще один интересный дистрибутив со своеобразной системой работы с пакетами. Здесь пакеты поставляются в виде исходных кодов и скриптов для сборки. Найти пакет по файлу вы можете с помощью утилиты equery, передав ей параметр b. Например:
Такой способ работает только для установленных пакетов. Из-за специфики дистрибутива для не установленных пакетов способа поиска не существует.
Выводы
Теперь вы знаете как понять какому пакету принадлежит файл в любом из самых популярных дистрибутивов Linux. Во всех дистрибутивах, основанных на Ubuntu и Debian, работает dpkg, для RPM-based дистрибутивов подходит утилита rpm. А два остальных менее популярных, но очень интересных мы рассмотрели отдельно. Если у вас остались вопросы, спрашивайте в комментариях!
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
How do I find out which package owns a file?
Alternatively, there are several utilites in Debian which perform this task; check this page for a description. I’ll mention two of them, apt-file and dlocate .
apt-file searches its internal cache, thus allowing you to not install all the packages you want to search. Below you will find more detailed guide.
dlocate is a fast alternative to dpkg -L (the command that lists package contents), and as so, it searches only installed packages. Search is performed by dlocate -S file.name .
Also you can search packages online using packages.debian.org server (the Search the contents of packages section).
Installing and using apt-file
It’s a good idea to update first:
sudo apt-get install apt-file
Read data from repositories (this works also without sudo but creates user’s cache then; with sudo the cache is system-wide):
Perform search. In this example we want to know in which package xrandr executable is:
It lists many packages with unxrandr , lxrandr.mo or source_lxrandr.py . Not very useful in our case. More clever search:
( $ denotes end of line). Example output:
bash-completion: /usr/share/bash-completion/completions/xrandr x11-xserver-utils: /usr/bin/xrandr
The first result doesn’t look like executable, the second one does. We can investigate further. Run:
apt-cache show x11-xserver-utils
Bingo! This is the package.