Что ещё должен знать молодой боец о rpm и grep.
Хотелось бы сделать несколько дополнений к статье "Поиск информации
об rpm-пакетах с использованием механизма конвейера и команды grep".
Бывает, что нужно найти пакеты, начинающиеся на определённую последовательность
символов, например, на xe:
$ rpm -qa | grep ^xe
xemacs-21.1.8-4mdk
xemacs-info-21.1.8-4mdk
xemacs-extras-21.1.8-4mdk
xearth-1.0-5mdk
xemacs-X11-21.1.8-4mdk
Часто программа требует отсутствующую библиотеку. Чтобы определить,
в каком rpm-пакете из дистрибутива находится нужный файл, можно создать
список файлов во всех rpm в дистрибутиве:
$ find /mnt/cdrom/Mandrake/RPMS -name "*.rpm" -exec rpm -qpil {}
>> list \;
Команда find находит на CD в каталоге Mandrake/RPMS все rpm-пакеты,
и для каждого из них запускает команду rpm с параметрами qpil. Параметр
q обозначает запрос о пакете, p - показывает, что речь идёт о неустановленном
пакете, i -
запрашивает информацию, и l - запрашивает список файлов. Вывод направляется
в файл list. В этом файле мы имеем описания пакетов и списки их файлов.
Теперь можем попробовать найти требуемый файл, например, FvwmAuto.1.bz2:
$ grep -B100 FvwmAuto.1.bz2 list | less
Команда grep найдёт в файле list строку, содержащую название нужного
файла, и выведет её и 100 строк перед ней, в которых наверняка будет название
пакета, содержащего файл FvwmAuto.1.bz2, и вывод будет направлен в текстовый
вьюер less.
Можно сделать даже так:
$ grep -B150 FvwmAuto.1.bz2 list | grep Name
Name : ftp
Relocations: (not relocateable)
Name : fvwm
Relocations: (not relocateable)
Name : fvwm2
Relocations: (not relocateable)
Тут команда grep найдёт строку с именем файла, выведет 150 строк перед
ней, и вывод будет направлен в следующий grep, который выделит строки,
содержащие имена пакетов. Последнее выведенное имя и будет именем необходимого
пакета.
Ali Albakov
guldur at transit.samara.net