web-dev-qa-db-fra.com

Comment lister tous les packages installés d'une catégorie spécifique (composant)

Est-il possible de répertorier tous les packages installés à partir d'un composant de référentiel officiel spécifique (principal, restreint, univers ou multivers) à l'aide d'utilitaires tels qu'apt, apt-cache, aptitude?

J'ai écrit un script simple à cet effet:

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;

Cela fonctionne, mais c'est vraiment lent car il vérifie tous les paquets un par un. L'exécution de la commande time pour ce script produira:

real    1m16.797s
user    0m57.008s
sys     0m8.260s

J'ai déjà essayé modèles de recherche d'aptitude , et dpkg-query formater, mais il semble qu'ils ne disposent pas de la colonne/du schéma approprié pour créer une requête à cette fin.

J'ai aussi jeté un œil au script vrms pour savoir comment cela fonctionne. Parce qu'il recherche très rapidement les paquets contrib/non-free, il semble que le script vrms analyse l'intégralité du fichier /var/lib/dpkg/status, chercher des choses comme 'Section: (contrib | non-free | restricted | multiverse | partner)', donc ce n'était pas utile non plus, car tous les packages ne possèdent pas cette section.

3
Ravexina

D'accord, je n'ai trouvé aucune solution pour ce faire avec les utilitaires standard, cependant, après avoir jeté un œil sur vrms , j'ai mis au point un script de meilleure qualité pour la recherche de paquets installés à partir d'un composant spécifique.

L'autre script que j'ai mentionné dans ma question prenait beaucoup de temps.
Cependant, le nouveau script est disponible ici: pkgs-from.sh

L'utilisation est:

./pkgs-from.sh universe # or main, multiverse, backports

Et le résultat de la commande time pour celui-ci est:

real    0m4.367s
user    0m0.980s
sys     0m0.408s

Ce qui est plutôt bien.

Comment ça marche?
Le script créera une liste de tous les packages liés au composant demandé à partir des fichiers associés dans le répertoire /var/lib/apt/lists/, puis commencera à effectuer une recherche dans l'ensemble au lieu d'utiliser apt-cache.

1
Ravexina