При написании многое подсмотрено здесь: 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
Как можно увидеть файл найден, но кроме него ещё и много лишнего:
На помощь можно призвать умные регулярные выражения, к примеру в следующей строке замените 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 действие <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
Заключение
Теперь, когда при очередной компиляции возникнет очередная ошибка из-за отсутствующего файла, вам не обязательно открывать Гугл и читать англоязычные форумы. Одной командой прямо в командной строке вы можете найти требуемый пакет.
Связанные статьи:
- Как найти дубликаты файлов на Linux с помощью dupeGuru (50%)
- Как записать терминальную сессию (50%)
- Какие есть полезные инструменты с интерфейсом командной строки для системных администраторов Linux (50%)
- Исправление ошибки error: postfix/master: fatal: 0.0.0.0:smtps: Servname not supported for ai_socktype (50%)
- Как включить SMPTS (465) postfix в Linux (50%)
- dpkg: ошибка при обработке пакета ...: пакет абсолютно неработоспособен; перед настройкой его следует переустановить (РЕШЕНО) (RANDOM - 50%)