Автор Тема: Поиск пакетов у которых пакет в зависимостях  (Прочитано 760 раз)

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Навеяно темой:
https://forum.altlinux.org/index.php?topic=40184.msg317831#msg317831
Ну и тут
https://forum.altlinux.org/index.php?topic=32361.msg317832#msg317832


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


Интерактивная версия

# cat ./apt-rdependsi
#!/bin/bash
#
# Reverse dependencies of the installed package
# Interactive version
#

RDEPPKG=""
ENABLEPKG=""

echo
echo "Поиск пакетов требующих указанный установленный пакет."
echo "Ввод в формате:"
echo "имя[-версия-релиз-платформа]"
echo
read -p "Введите имя пакета: " RDEPPKG
ENABLEPKG=`rpm -q --qf '%{NAME}\n' $RDEPPKG 2>/dev/null|wc -l`
echo

# Отладочная строка
# RDEPPKG='rpm'

if [[ "$ENABLEPKG" = 1 ]]
    then
echo -e 'Поиск установленных пакетов у которых пакет' $RDEPPKG 'в зависимостях\nПодождите пожалуйста...\n'; \
apt-get remove $RDEPPKG -s|grep Remv|grep -v $RDEPPKG|awk '{print $2}'|\
while read LINE; \
  do STR=`apt-cache depends $LINE|grep '^ '|grep -o $RDEPPKG|wc -w`; \
    if [ "$STR" != 0 ]; \
      then rpm -qi $LINE|grep ^Name|awk '{print $3}';\
    fi; \
done; echo
exit 0
    else
if [[ "$ENABLEPKG" = 0 ]]
    then
echo -e "Пакета" $RDEPPKG "в системе нет.\n"
fi
fi

Время работы скрипта сильно зависит от мощности компьютера и количества зависимостей:
см. вывод time в конце каждого вывода [часы:]минуты:секунды.доли_секунд
# time -f %E sh apt-rdepends

Поиск пакетов требующих указанный установленный пакет.
Ввод в формате:
имя[-версия-релиз-платформа]

Введите имя пакета: rpm

Поиск установленных пакетов у которых пакет rpm в зависимостях
Подождите пожалуйста...

alterator
python3
guile22-devel
alternatives
eepm
apt
basesystem
bash-completion
browser-plugins-npapi-devel
cmake
menu
etcskel
python-module-setuptools
glib2-devel
hcl-get
update-kernel
kernel-headers-common
service
control
gtk-update-icon-cache
shared-mime-info

6:15.08
# time -f %E sh apt-rdepends

Поиск пакетов требующих указанный установленный пакет.
Ввод в формате:
имя[-версия-релиз-платформа]

Введите имя пакета: libx265

Поиск установленных пакетов у которых пакет libx265 в зависимостях
Подождите пожалуйста...

gst-plugins-bad1.0
libavcodec56
libavcodec57

0:22.52
# time -f %E sh apt-rdepends

Поиск пакетов требующих указанный установленный пакет.
Ввод в формате:
имя[-версия-релиз-платформа]

Введите имя пакета: libx267

Пакета libx267 в системе нет.

0:04.43


Версия для командной строки

# cat ./apt-rdepends
#!/bin/bash
#
# Reverse dependencies of the installed package
# Command line version
#

RDEPPKG=""
ENABLEPKG=""

usage()
{
        echo -e "\nUsage: $0 <package_name>\n" >&2
        exit 1
}

[ -z "$1" ] && usage

export RDEPPKG=$1
ENABLEPKG=`rpm -q --qf '%{NAME}\n' $RDEPPKG 2>/dev/null|wc -l`

if [[ "$ENABLEPKG" = 1 ]]
    then
echo -e '\nПоиск установленных пакетов у которых пакет' $RDEPPKG 'в зависимостях\nПодождите пожалуйста...\n'; \
apt-get remove $RDEPPKG -s|grep Remv|grep -v $RDEPPKG|awk '{print $2}'|\
while read LINE; \
  do STR=`apt-cache depends $LINE|grep '^ '|grep -o $RDEPPKG|wc -w`; \
    if [ "$STR" != 0 ]; \
      then rpm -qi $LINE|grep ^Name|awk '{print $3}';\
    fi; \
done; echo
exit 0
    else
if [[ "$ENABLEPKG" = 0 ]]
    then
echo -e "\nПакета" $RDEPPKG "в системе нет.\n"
fi
fi

Скрипт обрабатывает:
Отсутствие параметра
# ./apt-rdepends

Usage: ./apt-rdepends <package_name>


Указание имени пакета как параметра
# ./apt-rdepends libx265

Поиск установленных пакетов у которых пакет libx265 в зависимостях
Подождите пожалуйста...

gst-plugins-bad1.0
libavcodec56
libavcodec57


Неверно указанное имя пакета
# ./apt-rdepends libx267

Пакета libx267 в системе нет.


Вот только с ядром не смог справиться...
# ./apt-rdepends make-initrd

Поиск установленных пакетов у которых пакет make-initrd в зависимостях
Подождите пожалуйста...

пакет kernel-image-std-def#1:4.4.31-alt1 не установлен
пакет kernel-image-std-def#1:4.4.35-alt1 не установлен
пакет kernel-image-std-def#1:4.4.27-alt1 не установлен
пакет kernel-image-un-def#1:4.13.3-alt1 не установлен
пакет kernel-image-std-def#1:4.9.52-alt1 не установлен
пакет kernel-image-std-def#1:4.4.34-alt1 не установлен
пакет kernel-image-std-def#1:4.9.20-alt1 не установлен
пакет kernel-image-std-def#1:4.4.30-alt1 не установлен
пакет kernel-image-std-def#1:4.4.44-alt1.1 не установлен
пакет kernel-image-std-def#1:4.4.53-alt1 не установлен
пакет kernel-image-std-def#1:4.4.55-alt1 не установлен
пакет kernel-image-std-def#1:4.4.47-alt1.1 не установлен
пакет kernel-image-std-def#1:3.14.79-alt0.M70P.2 не установлен
disable-usb-autosuspend


Если бы показал не так
Remv kernel-image-std-def#1:4.4.55-alt1 (1:4.4.55-alt1 )

а так
Remv kernel-image-std-def (1:4.4.55-alt1 )

awk бы распарсил абсолютно всё.
А проверка по условию, это вообще тяжёлая по тактам операция. И чем меньше их, тем лучше.
« Последнее редактирование: 21.10.2017 19:30:26 от Speccyfighter »

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Вот только с ядром не смог справиться...
# ./apt-rdepends make-initrd

Поиск установленных пакетов у которых пакет make-initrd в зависимостях
Подождите пожалуйста...

пакет kernel-image-std-def#1:4.4.31-alt1 не установлен
пакет kernel-image-std-def#1:4.4.35-alt1 не установлен
пакет kernel-image-std-def#1:4.4.27-alt1 не установлен
пакет kernel-image-un-def#1:4.13.3-alt1 не установлен
пакет kernel-image-std-def#1:4.9.52-alt1 не установлен
пакет kernel-image-std-def#1:4.4.34-alt1 не установлен
пакет kernel-image-std-def#1:4.9.20-alt1 не установлен
пакет kernel-image-std-def#1:4.4.30-alt1 не установлен
пакет kernel-image-std-def#1:4.4.44-alt1.1 не установлен
пакет kernel-image-std-def#1:4.4.53-alt1 не установлен
пакет kernel-image-std-def#1:4.4.55-alt1 не установлен
пакет kernel-image-std-def#1:4.4.47-alt1.1 не установлен
пакет kernel-image-std-def#1:3.14.79-alt0.M70P.2 не установлен
disable-usb-autosuspend


Если бы показал не так
Remv kernel-image-std-def#1:4.4.55-alt1 (1:4.4.55-alt1 )

а так
Remv kernel-image-std-def (1:4.4.55-alt1 )

awk бы распарсил абсолютно всё.
А проверка по условию, это вообще тяжёлая по тактам операция. И чем меньше их, тем лучше.

В принципе решение есть:

Это в строке 23
# cat -n ./apt-rdepends
     1 #!/bin/bash
     2 #
     3 # Reverse dependencies of the installed package
     4 #
     5
     6 RDEPPKG=""
     7 ENABLEPKG=""
     8
     9 usage()
    10 {
    11         echo -e "\nUsage: $0 <package_name>\n" >&2
    12         exit 1
    13 }
    14
    15 [ -z "$1" ] && usage
    16
    17 export RDEPPKG=$1
    18 ENABLEPKG=`rpm -q --qf '%{NAME}\n' $RDEPPKG 2>/dev/null|wc -l`
    19
    20 if [[ "$ENABLEPKG" = 1 ]]
    21     then
    22 echo -e '\nПоиск установленных пакетов у которых пакет' $RDEPPKG 'в зависимостях\nПодождите пожалуйста...\n'; \
    23 apt-get remove $RDEPPKG -s|grep Remv|grep -v $RDEPPKG|awk '{print $2}'|\
    24 while read LINE; \
    25   do STR=`apt-cache depends $LINE|grep '^ '|grep -o $RDEPPKG|wc -w`; \
    26     if [ "$STR" != 0 ]; \
    27       then rpm -qi $LINE|grep ^Name|awk '{print $3}';\
    28     fi; \
    29 done; echo
    30 exit 0
    31     else
    32 if [[ "$ENABLEPKG" = 0 ]]
    33     then
    34 echo -e "\nПакета" $RDEPPKG "в системе нет.\n"
    35 fi
    36 fi

добавить исключение пакетов kernel-* как обязательного компонента
# sed -n '23p' ./apt-rdepends-probe
apt-get remove $RDEPPKG -s|grep Remv|grep -v "$RDEPPKG\|kernel-"|awk '{print $2}'|\

и тогда вывод перебора сменится с
# sync && echo 3 > /proc/sys/vm/drop_caches
# time -f %E sh apt-rdepends make-initrd

Поиск установленных пакетов у которых пакет make-initrd в зависимостях
Подождите пожалуйста...

пакет kernel-image-std-def#1:4.4.31-alt1 не установлен
пакет kernel-image-std-def#1:4.4.35-alt1 не установлен
пакет kernel-image-std-def#1:4.4.27-alt1 не установлен
пакет kernel-image-un-def#1:4.13.3-alt1 не установлен
пакет kernel-image-std-def#1:4.9.52-alt1 не установлен
пакет kernel-image-std-def#1:4.4.34-alt1 не установлен
пакет kernel-image-std-def#1:4.9.20-alt1 не установлен
пакет kernel-image-std-def#1:4.4.30-alt1 не установлен
пакет kernel-image-std-def#1:4.4.44-alt1.1 не установлен
пакет kernel-image-std-def#1:4.4.53-alt1 не установлен
пакет kernel-image-std-def#1:4.4.55-alt1 не установлен
пакет kernel-image-std-def#1:4.4.47-alt1.1 не установлен
пакет kernel-image-std-def#1:3.14.79-alt0.M70P.2 не установлен
disable-usb-autosuspend

1:39.90

на
# sync && echo 3 > /proc/sys/vm/drop_caches
# time -f %E sh apt-rdepends-probe make-initrd

Поиск установленных пакетов у которых пакет make-initrd в зависимостях
Подождите пожалуйста...

disable-usb-autosuspend

0:43.85

Всё остальное (кроме кернала) будет выводиться как обычно
# time -f %E sh apt-rdepends-probe etcnet

Поиск установленных пакетов у которых пакет etcnet в зависимостях
Подождите пожалуйста...

alterator-net-eth
alterator-net-openvpn
alterator-net-functions
pptp-client

0:09.87


apt-rdepends-probe потому что проба. Дубликат для изменений.

Скрипт опрашивает и выводит только установленные пакеты.
« Последнее редактирование: 21.10.2017 22:06:06 от Speccyfighter »