zaLinux.ru

Как в Linux узнать, в каком пакете содержится файл


При написании многое подсмотрено здесь: Find which package contains a file in Debian Linux

Если вы компилируете программы из исходных кодов, то вы, наверняка, сталкивались с ошибками компиляции, когда программа не находит какой-либо файл и компиляция обрывается. Что делать в данной ситуации? Понятно, что нужно установить пакет, который содержит требуемый файл. Но как узнать имя этого пакета?

Вполне возможно, что вас выручит Гугл, достаточно в строке поиска набрать что-нибудь вроде fatal error: ffi.h и уже в первых результатах поиска вы найдёте сайты с ответом на ваш вопрос. Это не самый хороший способ, поскольку:

  • если постоянно надеяться только на Google, то в конце-концов он подведёт;
  • обычно ссылки ведут нас на англоязычные сайты — а с иностранными языками в РФ так себе;
  • ну и, в конце-концов, это просто нубство.

В этой заметке я расскажу о нескольких способах узнать имя пакета, содержащего требуемый файл.

apt-file

Эта программа предназначена для поиска файлов в пакетах. Также она может показать все файлы в пакете.

Установка программы:

sudo apt-get install apt-file

Сразу после установки кэш данных о программах пуст. Чтобы его обновить нужно выполнить команду (можно выполнять как от рута, так и от пользователя):

apt-file update

Когда всё готово, то поиск осуществляется так:

apt-file search имя_файла

К примеру я ищу файл ffi.h:

apt-file search ffi.h

Как можно увидеть файл найден, но кроме него ещё и много лишнего:

01

На помощь можно призвать умные регулярные выражения, к примеру в следующей строке замените ffi.h на тот файл, который вы ищите — и вы всегда будете получать самый точный результат:

t=ffi.h; apt-file search $t | grep -E "/$t$"

02

Ну и для любителей графического интерфейса, вот вам от меня графический интерфейс:

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

03

04

Справка по команде apt-file

apt-file [опции] действие [образец]
apt-file [опции] -f действие <файл>
apt-file [опции] -D действие <deb_файл>

Configuration options:
    --architecture     -a  <арх>       Использовать определённую архитектуру
    --cache            -c  <дир>        Директория кэша
    --cdrom-mount      -d  <cdrom>      Использовать особую точку монтирования 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 и других. Её цель — простое управление пакетами из одного интерфейса путём унификации главных функций этих инструментов.


Установка whichpkg

sudo apt-get install wajig

Использование: whichpkg


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.

Программа также имеет простую базу данных для поиска пакета, содержащего требуемый файл.

Установка auto-apt:

sudo apt-get install auto-apt

После установки нужно обновить список пакетов следующей командой:

sudo auto-apt update

Поиск осуществляется так:

auto-apt search имя_файла

Пример:

auto-apt search ffi.h

Лично у меня программа не сработала ни на одной из двух систем (на одной не смогла полностью загрузить файлы с содержанием пакетов, как следствие — поиск ничего не нашёл, на другой системе программа вообще ничего не стала загружать).


dlocate

dlocate является альтернативой dpkg -L и dpkg -S. Её преимуществом является более быстрый поиск, разные дополнительные функции вроде подсчёта занимаемого места, но… она ищет только по установленным пакетам — т. е. для целей, которые озвучены в начале заметки она неприменима.

Установка dlocate:

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

Заключение

Теперь, когда при очередной компиляции возникнет очередная ошибка из-за отсутствующего файла, вам не обязательно открывать Гугл и читать англоязычные форумы. Одной командой прямо в командной строке вы можете найти требуемый пакет.


Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *