Как мне узнать, какой пакет rpm содержит файл, который я ищу?


207

В качестве примера я ищу mod_files.shфайл, который предположительно будет поставляться с php-develпакетом. Я догадался, yumчто установит mod_files.shфайл с php-devel x86_64 5.1.6-23.2.el5_3пакетом, но файл, похоже, не будет установлен в моей файловой системе.

Как узнать, какой пакет устанавливает конкретный файл? Я ищу, где я не обязательно уже скачал локально пакет, который может включать файл, который я ищу.

Я использую CentOS 5.


7
superuser.com ___?
Гжегож Оледзки

@Grzegorz Хороший вопрос, я проголосовал, чтобы двигаться.
2010 года


1
Ответ @SamWatkins будет работать только в том случае, если в системе уже установлен пакет, который предоставляет искомый файл. Если пакет не установлен (как говорит OP), то вы не можете использовать rpm, вам нужно использовать yum.
RJH

Ответы:


266

Это старый вопрос, но текущие ответы неверны :)

Используйте yum whatprovides с абсолютным путем к нужному файлу (который может быть подстановочным). Например:

yum whatprovides '*bin/grep'

Возвращает

grep-2.5.1-55.el5.x86_64 : The GNU versions of grep pattern matching utilities.
Repo        : base
Matched from:
Filename    : /bin/grep

Вы можете предпочесть выход и скорость repoqueryинструмента, доступного в yum-utilsпакете.

sudo yum install yum-utils
repoquery --whatprovides '*bin/grep'
grep-0:2.5.1-55.el5.x86_64
grep-0:2.5.1-55.el5.x86_64

repoquery может выполнять другие запросы, такие как перечисление содержимого пакета, зависимостей, обратных зависимостей и т. д.


199

Чтобы узнать пакет, владеющий (или предоставляющий) уже установленным файлом:

rpm -qf myfilename

4
эта команда выглядит более эффективной, чем yum whatprovides - нет необходимости получать обновления из, возможно, медленных репозиториев.
80x25

Эта версия также работает на дистрибутивах, не основанных на Redhat, которые все еще используют rpm, такие как openSUSE
simotek

5
Мне кажется, что rpm -qf <filename>он лучше всего подходит для определения того, какой пакет предоставляет установленное приложение (поскольку он может отличаться от того, что находится в текущем кэше репозитория yum), и yum whatprovides <filename>лучше всего подходит для определения, какой пакет еще не установлен. применение. У каждого своя цель.
StockB

Кроме того, yum whatprovides ...требуется только root, если приложение является корневым пакетом (т. Е. Оно находится в /sbin). Однако, rpm -qf ...также требует root для чтения rpms из /sbin. Поэтому я предлагаю, чтобы корневые требования были функционально эквивалентны для обоих методов.
StockB

1
Если вы используете эту команду, обратите внимание, что вы должны использовать полный путь к файлу + имя файла, а не только имя файла.
Ашиш

31

Самый популярный ответ неполный:

Так как этот поиск обычно выполняется только для файлов из установленных пакетов, yum whatprovides быстро работает благодаря отключению всех внешних репо (неявное «установленное» репо не может быть отключено).

yum --disablerepo=* whatprovides <file>

4
В этом случае, однако, OP специально ищет отсутствующий файл, который не был установлен в системе, даже после установки пакета, который, как он думал, будет иметь его, поэтому он не может его использовать--disablerepo=*
Randall

4

Вы идете на http://www.rpmfind.net и ищете файл.

Вы получите результаты для множества разных дистрибутивов и версий, но вполне вероятно, что Fedora и / или CentOS тоже появятся, и вы будете знать имя пакета для установки с yum


Сайт недоступен!
Питер

1
Сайт не отображается для поиска файлов; только имена пакетов с поисковым запросом.
jww

1
@jww Поиск файлов, по крайней мере, мне подходит. Как сказано в документации, вы можете искать исполняемые файлы по их одиночному пути или по любому файлу с абсолютным путем.
Нос

4

Хорошо найти пакет, когда вы подключены к Интернету (хранилище), легко, однако, когда у вас есть доступ только к RPM-пакетам внутри Redhat или Centos DVD (это часто случается со мной, когда мне нужно восстановить сервер и мне нужно приложение), я рекомендую используя команды ниже, которые полностью независимы от Интернета и репозиториев. (возможно, у вас есть много неустановленных пакетов на DVD). Допустим, вы смонтировали папку Package в ~ / cent_os_dvd и ищете пакет, который обеспечивает «semanage», после чего вы можете запустить:

for file in `find ~/cent_os_dvd/ -iname '*.rpm'`;  do rpm -qlp $file |grep '.*bin/semanage';  if [ $? -eq 0 ]; then echo "is in";echo $file  ; fi;  done


0

Вы можете сделать это здесь, но с вашим пакетом. В моем случае это былоlsb_release

Бегать: yum whatprovides lsb_release

Отклик:

redhat-lsb-core-4.1-24.el7.i686 : LSB Core module support
Repo        : rhel-7-server-rpms
Matched from:
Filename    : /usr/bin/lsb_release

redhat-lsb-core-4.1-24.el7.x86_64 : LSB Core module support
Repo        : rhel-7-server-rpms
Matched from:
Filename    : /usr/bin/lsb_release

redhat-lsb-core-4.1-27.el7.i686 : LSB Core module support
Repo        : rhel-7-server-rpms
Matched from:
Filename    : /usr/bin/lsb_release

redhat-lsb-core-4.1-27.el7.x86_64 : LSB Core module support
Repo        : rhel-7-server-rpms
Matched from:
Filename    : /usr/bin/lsb_release`

Запустите для установки: yum install redhat-lsb-core

Имя пакета ДОЛЖНО быть без номера и типа системы, чтобы yum packager мог выбрать, что лучше для него.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.