57 votes

Comment puis-je lister tous les paquets que j'ai installés à partir d'un dépôt particulier ?

Comment puis-je lister tous les paquets que j'ai installés à partir d'un dépôt particulier ?

Comment puis-je lister tous les paquets installés qui ne sont pas disponibles dans les archives principales d'Ubuntu, et aussi voir de quels dépôts ils proviennent ? (Si je connaissais la réponse à cette question, je pourrais parcourir cette liste à la recherche d'un nom de PPA particulier pour trouver la réponse à ma première question).

2voto

Patrick Häcker Points 161

Si vous avez un système sans serveur Wayland/X (comme un Raspberry Pi), les réponses de andrewsomething et lovinglinux ne peut être utilisé. La réponse de jarno limite le cas d'utilisation aux seuls AAE, bien que la question soit d'intérêt général. Les scripts de Riccardo Murri et Graham Dunn sont assez lents en raison de la répétition apt-cache policy appels (environ 10 minutes d'exécution).

Voici donc mon appel résolvant le cas général sur un Shell étant beaucoup plus rapide (comme moins de 10 secondes de temps d'exécution)

apt list --installed 2> /dev/null \
  | cut -d/ -f1 \
  | parallel -n200 apt-cache policy \
  | rg '^(\S+)[\s\S]+?\* (?:\S+\s+){3}(\S+)' -Uor '$1 $2'

apt list --installed obtient une liste de tous les paquets installés en ignorant le message d'apt sur les possibles changements de format futurs avec 2> /dev/null et en extrayant uniquement les noms des paquets avec cut en utilisant / comme délimiteur avec -d/ et en retournant le premier champ avec -f1 .

Ensuite, apt-cache policy est utilisé pour obtenir plus d'informations sur tous les paquets. Ceci pourrait être exécuté avec xargs, comme apt-cache attend son entrée comme argument de ligne de commande. Comme il s'agit de la partie la plus critique en termes de performances, GNU parallel du paquet parallel est utilisé à la place pour exécuter plusieurs apt-cache en parallèle, recherchant 200 paquets, chacun utilisant -n200 . Notez que xargs peut aussi exécuter plusieurs commandes en parallèle, mais synchronise la sortie sur newline, ce qui n'est pas correct ici en général.

Enfin, apt-cache La sortie de l'utilisateur est analysée avec rg du paquet ripgrep qui est très rapide et capable de gérer plusieurs lignes grep successeur avec -U permettant de sortir deux groupes de capture d'expressions régulières avec -or '$1 $2' . L'expression régulière capture le nom du paquet avec ^(\S+) , passe à la dernière étoile en marquant le dépôt installé avec [\s\S]+?\* puis saute trois mots avec (?:\S+\s+){3} et enfin capture le référentiel avec (\S+) .

1voto

Aaron Whitehouse Points 111

Quelque chose comme ceci Python script devrait trouver tous les paquets non-Ubuntu installés sur votre machine :

#!/usr/bin/env python3
#
# This lists all packages not from Ubuntu's (e.g. main/universe) repositories
# To use, simply download/copy into a .py file and run with:
# python3 list_non_ubuntu.py
#
# If you receive an import error, you may need to install python3-apt first with e.g.
# sudo apt install python3-apt
# but this is often not necessary

import apt

cache = apt.Cache()
package_count = 0

for package in cache:
    if (
        package.is_installed
        and package.candidate.origins[0].origin != "Ubuntu"
    ):
        package_origin = package.candidate.origins[0]
        print(
            package.name,
            # See https://apt-team.pages.debian.net/python-apt/library/apt.package.html#apt.package.Origin
            # for further details on the meanings of the below
            package_origin.origin,  # The Origin, as set in the Release file
            package_origin.archive,  # The archive (eg. Ubuntu release name)
            package_origin.component,  # The component (eg. main/universe)
            package_origin.site,  # The hostname of the site.
            # package_origin.label,  # The Label, as set in the Release file
            # package_origin.trusted,  # Origin trusted (Release file signed by key in apt keyring)
        )
        package_count += 1

print(package_count, "packages not from Ubuntu")

Sur ma machine, il a fallu moins de 5 secondes pour l'exécuter, contre plus de 8 minutes pour la meilleure réponse actuelle (de Riccardo/Pablo). La sortie est au format :

$ python3 list_non_ubuntu.py 
azure-cli azure-cli focal focal main packages.microsoft.com
google-chrome-stable Google LLC stable main dl.google.com
[...]
signal-desktop . xenial xenial main updates.signal.org
8 packages not from Ubuntu

Vous pourriez alors ajouter un and package.candidate.origins[0].site == "[ppa-domain.com]" après le .origin != "Ubuntu" si vous ne voulez que ceux d'un ppa particulier.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X