LINUX.ORG.RU

Обратный поиск по файлу

 , , ,


1

1

Нужно найти в каком пакете находится файл, беру файл MANIFEST.bz2 (репозитарий Slackware). в файле перечислено содержимое пакетов типа:

++========================================
||
||   Package:  ./a/bash-5.0.011-i586-1.txz
||
++========================================
drwxr-xr-x root/root         0 2019-08-30 13:45 ./
drwxr-xr-x root/root         0 2019-08-30 13:45 bin/
-rwxr-xr-x root/root   1138336 2019-08-30 13:45 bin/bash5.new
drwxr-xr-x root/root         0 2019-08-30 13:45 install/
-rw-r--r-- root/root       362 2019-08-30 13:45 

Найти файл проблемы нет, а далее надо сделать обратный поиск до первого Package и вот это не представляю как делается. Гуглится пример с использованием sed, но что-то не могу его разобрать пока.

Может в Slackware есть утилита для подобного поиска?

★★★★★
Ответ на: комментарий от peregrine

да, вот нашел я bash5.new, теперь надо найти как пакет называется, а это надо до строки Package: ./a/bash-5.0.011-i586-1.txz поискать.

Потом уже строку эту переделать для скачивания, но это мелочи.

irton ★★★★★
() автор топика

Утилита:
slackpkg file-search чего/надо-найти

Но можно и руками:
F=чего/надо-найти
bzgrep «Package:\|$F» | grep -B1 $F

bormant ★★★★★
()
Ответ на: комментарий от bormant

bzgrep «Package:\|$F» | grep -B1 $F

не, это же она сначала пакет найдет, а я пакета еще не знаю, например libva искать в каком пакете.

slackpkg почитаю, спасибо.

irton ★★★★★
() автор топика
Ответ на: комментарий от bormant

капец, работает! а как это?

Сначала ищутся все Package строки и строка с именем совпадающим с именем библиотеки, потом отфильтровывается имя библиотеки и строка предшествующая ей?

irton ★★★★★
() автор топика
Ответ на: комментарий от irton

Ну вы правильно же всё сказали. Если в момент инсталляции, когда скрипта bzgrep ещё нет, то и его можно ручками:

bzcat MANIFEST.bz2 | grep -e Package: -e "$F" | grep -B1 "$F"

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от irton

Нет, у меня live система все присутствует.

Я рад за вас, но причём тут «Нет»? Что там у вас не было описано, не очень интересно, изменения в скрипте не существенны и могут кому-то, а может даже потом и вам пригодиться.

vodz ★★★★★
()
Ответ на: комментарий от vodz

«Нет» в том плане что в системе bzgrep есть, вы же в сообщение написали что ваш вариант на случай отсутствия bzgrep.

Ваш код предпочтительнее, в том плане, что выдает только строку с пакетом, без строки с именем модуля или я не так понял?

irton ★★★★★
() автор топика

плохо понял задачу, но думаю что раз вы свели её к другой, вида:
«найти искомую строчку, и после нее искать в следующих»
и разобрались как её выполнить, то велосипедировать дальше поможет утилитка tac.
которая аналогично cat только выплевывает в stdout файл или поток с обратным порядком срок.

bl ★★★
()

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

awk -v myfilename="bash5.new" '{ if ($0 ~ "Package:") {package = $0}; if ($0 ~ myfilename ) {print package} } '


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

bl ★★★
()
Ответ на: комментарий от bl

Нет, в случае с grep выделяется только название пакетов и строка с совпадающим файлом, а потом опять же используя grep -B1 выводится строка с файлом и предыдущая строка т.е. С названием пакета.

irton ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.