Як знайти, який пакунок 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 Oledzki

@Grzegorz Добре, я взяв участь у голосуванні, щоб рухатись.
rjh

ось краща відповідь: unix.stackexchange.com/a/4706/39281
Сем Уоткінс

1
@SamWatkins, що відповість, спрацює лише в тому випадку, якщо пакет, який постачає файл, який ви шукаєте, вже встановлений у системі. Якщо пакет не встановлений (як каже ОП), ви не 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 - не потрібно отримувати оновлення з можливо повільних сховищ.
80х25

Ця версія також працює на дистрибутивах, що не базуються на Redhat, які все ще використовують rpm, такі як openSUSE
simotek

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

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

1
Усі, хто використовує цю команду, зауважте, що ви повинні використовувати повний шлях до файлу + ім'я файлу, а не лише ім'я файлу.
Ашиш

31

Найпопулярніша відповідь неповна:

Оскільки цей пошук, як правило, здійснюватиметься лише для файлів із встановлених пакетів, yum whatprovides робиться блискуче швидким шляхом відключення всіх зовнішніх репостів (неявну "встановлену" репо не можна відключити).

yum --disablerepo=* whatprovides <file>

4
Однак у цьому випадку ОП спеціально шукає файл, що відсутній, який не був встановлений у системі, навіть після встановлення пакету він думав, що його буде мати, тому він не може використовувати--disablerepo=*
Рандалл,

4

Ви переходите на сторінку http://www.rpmfind.net і шукаєте файл.

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


Цей вебсайт офлайн!
Пітер

1
Не відображається веб-сайт для пошуку файлів; лише назви пакетів із пошуковою терміном.
jww

1
@jww Пошук файлів працює принаймні для мене. Як кажуть документи, ви можете шукати виконувані файли за їхнім єдиним іменем шляху або будь-яким файлом з абсолютною назвою шляху.
NOS

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 packger міг вибрати те, що найкраще підходить для нього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.