Действительно ли возможно перечислить все установленные пакеты от определенного официального компонента репозитория (Основной, Ограниченный, Вселенная или Мультивселенная) использование утилит как способный, способный кэш, способность?
Я записал простой сценарий с этой целью:
dpkg -l | grep ^ii | cut -f3 -d ' ' | while read -r pkg;
do
status=`apt-cache show $pkg | grep -m1 "Section: multiverse"`
if [ ! -z "$status" ]
then
echo $pkg
fi
done;
Это работает, но это - действительно медленная причина, это проверяет все пакеты один за другим. Выполнение time
команда для этого сценария произведет:
real 1m16.797s
user 0m57.008s
sys 0m8.260s
Я уже попробовал шаблоны поиска способности и форматирование dpkg-запроса, но кажется, что у них нет надлежащего столбца/схемы для создания запроса с этой целью.
Я также взглянул на vrms сценарий, чтобы узнать, как это - работы, потому что это действительно быстро в нахождении contrib/non-free пакеты, это, кажется, что vrms сценарий сканирует целое /var/lib/dpkg/status
файл, ища вещи как 'Раздел: (contrib | несвободный | ограниченный | мультивселенная | партнер)', таким образом, это не было полезно также, потому что не все пакеты имеют этот раздел.
Хорошо, я не сделал нашел любое решение сделать это со стандартными утилитами, однако после того, чтобы взглянуть на телефон vrms
, я придумал симпатичный лучший сценарий для поиска пакетов, установленных от определенного компонента.
другой сценарий, который я упомянул в своем вопросе, был действительно трудоемким.
Однако новый сценарий доступен здесь: pkgs-from.sh
использование:
./pkgs-from.sh universe # or main, multiverse, backports
И time
результат команды для этого:
real 0m4.367s
user 0m0.980s
sys 0m0.408s
, Который довольно хорош.
, Как это работает?
сценарий создаст список всех пакетов, связанных с требуемым компонентом из связанных файлов в /var/lib/apt/lists/
каталог, затем начинает искать всюду по ним вместо того, чтобы использовать apt-cache
.
Здесь мой сценарий для мониторинга установленных пакетов для данного компонента
FILTER=non-free TMP_DIR=$(mktemp -d) && {
dpkg -l | grep ^ii | cut -f 3 -d' ' | cut -f 1 -d : | sort | uniq > ${TMP_DIR}/pkg_installed.list
cat /var/lib/apt/lists/*_${FILTER}_*Packages | grep "^Package:" | sort | uniq | cut -d' ' -f2 > ${TMP_DIR}/pkg_filtered.list
comm -12 ${TMP_DIR}/pkg_installed.list ${TMP_DIR}/pkg_filtered.list
}