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+)
.