Comment obtenir la liste des packages installés correspondant à un modèle?

11

Je suis sur un système exécutant une distribution Debian (assez récente).

Je voudrais générer une liste simple de tous les packages installés correspondant à un certain modèle. Je peux le faire en courant, disons,

apt list --installed "linux-image-*" | cut -d/ -f1

mais j'obtiens des lignes qui ne m'intéressent pas, par exemple:

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Listing...

Alors peut-être que je ferais mieux de ne pas utiliser apt. Je peux exécuter dpkg-query comme ceci:

dpkg-query --showformat='${Package}\n' --show "linux-image*"

mais cela ne se limite pas aux packages installés. je pourrais utiliser

dpkg-query --list "linux-image-*" | grep "ii"

mais alors je devrais faire un tas de traitement de texte, et qui peut faire confiance à ces espaces, non?

Donc, en fin de compte: quelle est la bonne façon d'obtenir la liste des packages installés correspondant à un modèle?


Remarque :

  • Points bonus s'il peut s'agir d'une expression rationnelle appropriée plutôt que d'un simple glob de shell.
  • Devoir analyser le texte semble être une solution loin d'être idéale; si c'est ce que vous suggérez, veuillez expliquer pourquoi il n'y a pas de meilleure façon.
einpoklum
la source

Réponses:

8

aptitude prend en charge la recherche parmi tous les packages connus des outils de gestion de packages, installés ou non, à l'aide d'expressions régulières, sans sortie étrangère, et peut savoir comment formater sa sortie:

aptitude search "linux-image-.*"

Pour répertorier uniquement les packages installés:

aptitude search "linux-image-.* ~i"

Pour répertorier uniquement les noms de packages installés correspondant à l'expression régulière:

aptitude search "linux-image-.* ~i" -F "%p"

La documentation couvre en détail les modèles de recherche disponibles et les spécificateurs de format de sortie . Vous trouverez également des exemples sur ce site, par exemple, existe-t-il un moyen d'utiliser regexp avec aptitude? , regexp avec aptitude partie 2 , et Linux - afficher ou mettre à jour les mises à jour de sécurité uniquement en utilisant apt .

Stephen Kitt
la source
6

Voici une bonne façon d'obtenir la liste des paquets installés sur un système basé sur Debian:

dpkg -l | grep ^ii | awk '{print $2}'

Les lignes de sortie de dpkg -lpeuvent être considérées comme saines. Le modèle ^iicorrespondra aux lignes des packages installés et le simple Awk extraira la deuxième colonne, les noms des packages (les mêmes noms utilisés dans les apt-get installcommandes). Les noms de packages ne peuvent pas contenir d'espaces, c'est donc à nouveau une opération sûre.

janos
la source
Cela fonctionne lorsque vous souhaitez effectuer une grep par version. Les réponses avec aptitude searchet apt listdans ce cas ne le font pas.
Hi-Angel
6
$ apt list --installed "linux-image-*" 2>/dev/null |awk -F'/' 'NR>1{print $1}'
linux-image-3.16.0-4-amd64
linux-image-4.11.0-1-amd64
linux-image-4.12.0-1-amd64
linux-image-4.13.0-1-amd64
linux-image-4.8.0-2-amd64
linux-image-4.9.0-1-amd64
linux-image-4.9.0-2-amd64
linux-image-4.9.0-3-amd64

Parler de regex:

$ apt list --installed "linux-image-*" 2>/dev/null |awk -F'/' 'NR>1 && $0~/4.1/{print $1}'
linux-image-4.11.0-1-amd64
linux-image-4.12.0-1-amd64
linux-image-4.13.0-1-amd64

Vous pouvez également utiliser dpkg-queryavec -f(--showformat) option, lorsqu'elle est appelée sans aucun nom de package par défaut sont listés les paquets uniquement installés.

$ dpkg-query -f '${Package}\n' -W |grep 'linux-image' #-W == --show
George Vasiliou
la source
1

Afin de "piéger" le terme recherché lors de la sortie de grep ping dpkg , vous devez mettre le terme de recherche comme suit. " git " est utilisé comme terme de recherche de spécimen:

dpkg -l |grep "^ii  git[[:space:]]"

Le carat (^) ii suivi de (2) espaces précédant le terme recherché ne garantit rien AVANT que la combinaison de caractères puisse correspondre.

La [[:space:]]contiguïté du terme recherché empêche les correspondances partielles de se produire uniquement en faisant correspondre les espaces immédiatement après .

F1Linux
la source