Ubuntu / Lister les paquets installés avec apt et dpkg-query

Sur Ubuntu, apt list --installed affiche une liste lisible des paquets Deb installés. Pour un contrôle précis ou un inventaire exploitable dans un script, utilisez dpkg-query en vérifiant aussi l’état du paquet : une entrée présente dans la base n’est pas forcément un logiciel encore installé.

Afficher les paquets Deb installés

Les paquets Deb sont les paquets gérés par le système Debian/Ubuntu ; dpkg tient leur base locale et APT organise notamment leur installation depuis les dépôts. Pour consulter la liste :

apt list --installed

La sortie indique notamment nom, version et architecture. Pour parcourir une longue liste ou limiter les noms à une famille :

apt list --installed | less
apt list --installed 'nginx*'

Dans less, utilisez la recherche avec /, puis q pour quitter. Les guillemets autour du motif empêchent son développement par le shell. Ces consultations ne demandent normalement pas sudo.

apt est conçu comme interface interactive, comme le précise son manuel Ubuntu. Pour un fichier ou un traitement automatisé, choisissez un format explicite avec dpkg-query plutôt que d’analyser la présentation destinée à l’écran.

Vérifier un paquet précis et comprendre son état

Lire l’état complet avant de conclure

dpkg-query -s nginx
dpkg-query -W -f='${db:Status-Status}\n' nginx

Remplacez nginx par le nom exact, éventuellement qualifié par son architecture, comme nom:amd64. Le premier résultat décrit l’entrée enregistrée. La ligne Status: install ok installed correspond à une installation demandée et achevée sans indicateur d’erreur dans cet état.

La seconde commande affiche seulement le statut courant, par exemple installed ou config-files. Un paquet supprimé avec des configurations conservées peut toujours être trouvé avec un code de retour réussi : ne confondez pas « requête réussie » et « installé ». Si le paquet est absent de la base ou si la requête échoue, le code de retour est non nul.

Voici un contrôle utilisable dans un shell Bash ; il distingue l’état retourné d’un échec de la requête sans modifier les paquets :

package=nginx
if package_state=$(dpkg-query -W -f='${db:Status-Status}' -- "$package"); then
  if [ "$package_state" = installed ]; then
    printf '%s : installé\n' "$package"
  else
    printf '%s : état %s\n' "$package" "$package_state"
  fi
else
  printf 'Requête impossible ou paquet absent de la base : %s\n' "$package" >&2
fi

Ce contrôle porte sur l’état enregistré, pas sur l’intégrité des fichiers ou le fonctionnement d’un service. Pour analyser une erreur plus précisément, conservez le diagnostic de dpkg-query et consultez aussi le résultat complet de -s.

Lire les colonnes de la liste détaillée

dpkg-query -l 'nginx*'

Les trois premières positions indiquent l’action souhaitée, l’état courant et un éventuel indicateur d’erreur. Ne comptez pas toutes les lignes de cette sortie comme des paquets installés.

Affichage Interprétation
ii Installation souhaitée et état installé ; vérifiez aussi la troisième position.
hi Paquet conservé en attente (hold) et actuellement installé.
rc Paquet supprimé avec des fichiers de configuration encore enregistrés.
iU Paquet décompressé, dont la configuration n’est pas achevée.
R en troisième position Indicateur signalant qu’une réinstallation est requise.

D’autres états décrivent une configuration incomplète ou des traitements de déclencheurs en attente. Consultez le manuel de dpkg-query pour leur signification exacte, plutôt que de supprimer un paquet uniquement à partir d’une lettre.

Comparer version installée et version candidate

Pour afficher le nom et la version enregistrée de curl :

dpkg-query -W -f='${binary:Package}\t${Version}\n' curl

Cette commande doit être interprétée avec le statut vérifié précédemment : elle ne filtre pas à elle seule les paquets supprimés. Le champ binary:Package ajoute le qualificatif d’architecture quand il est nécessaire pour distinguer les paquets, notamment dans une installation multiarchitecture.

apt-cache policy curl

Installed indique la version installée connue d’APT. Candidate correspond au choix d’APT selon ses métadonnées et priorités ; ce n’est pas une promesse d’installation ni nécessairement la version la plus élevée publiée par le projet. La table de versions aide à comprendre les dépôts et priorités en jeu.

Les données peuvent être anciennes : avant une décision de mise à jour, actualisez les index avec sudo apt update, contrôlez les erreurs éventuelles puis répétez la consultation. Cette actualisation ne met pas à jour les paquets installés. Le manuel apt-cache précise que ses requêtes reposent sur le cache local.

Retrouver les fichiers et le paquet qui les fournit

Afficher les chemins enregistrés pour un paquet

dpkg-query -L nginx

La liste provient de la base dpkg. Elle ne couvre pas nécessairement journaux, bases de données, fichiers téléversés ou autres données créées ensuite par l’application ou ses scripts. Un logiciel peut aussi être réparti entre plusieurs paquets, par exemple un paquet principal et un paquet de fichiers communs.

Partir d’un fichier existant

dpkg-query -S /usr/bin/curl

Le propriétaire indiqué ici est un paquet, pas l’utilisateur Unix propriétaire du fichier. Si la cible est un lien symbolique, interrogez également son chemin résolu, à condition qu’elle existe. Exemple pour Python 3 :

if [ -e /usr/bin/python3 ]; then
  resolved_path=$(readlink -f /usr/bin/python3) &&
    dpkg-query -S -- "$resolved_path"
else
  printf '/usr/bin/python3 est absent ou son lien est cassé.\n' >&2
fi

Le lien et sa cible peuvent relever de paquets différents. Les alternatives et les fichiers créés par des scripts ne sont pas tous couverts par cette recherche. Une absence de correspondance n’autorise donc pas à conclure qu’un fichier est inutile.

Pour chercher un fichier dans les dépôts même si le paquet correspondant n’est pas installé, utilisez une recherche indexée distincte, par exemple apt-file. Après son installation depuis vos dépôts, actualisez ses index de contenu avec sudo apt-file update, puis utilisez par exemple apt-file search /usr/bin/curl. Le manuel apt-file décrit les index requis et la recherche ; cela ne remplace pas le contrôle de l’état local avec dpkg.

Distinguer les installations manuelles et automatiques

apt-mark showmanual
apt-mark showauto

APT distingue les paquets marqués manuels des dépendances marquées automatiques. La liste manuelle peut contenir des composants de l’installation initiale et des métapaquets : elle n’est pas un historique des applications ajoutées personnellement après l’installation d’Ubuntu.

Un paquet automatique qui n’est plus nécessaire à un paquet manuel peut devenir candidat au nettoyage. Pour examiner la proposition sans la réaliser :

sudo apt autoremove --dry-run

Lisez toute la liste avant une suppression réelle, surtout les métapaquets du bureau ou du système. Les commandes showmanual et showauto consultent des marques ; elles ne vérifient pas si vous utilisez encore un programme. Le manuel apt-mark explique ces raisons d’installation.

Exporter seulement les paquets à l’état installé

Pour un inventaire, un simple dpkg-query -W sans filtre d’état peut inclure des entrées qui ne correspondent plus à des paquets installés. La commande suivante conserve les lignes dont le statut courant est installed, puis produit nom, version et architecture, séparés par des tabulations :

dpkg-query -W -f='${db:Status-Status}\t${binary:Package}\t${Version}\t${Architecture}\n' \
  | awk -F '\t' '$1 == "installed" { print $2 "\t" $3 "\t" $4 }' \
  | LC_ALL=C sort

Le filtre n’exige pas la lettre d’action souhaitée i : un paquet installé et retenu avec hold doit aussi apparaître. La liste reste un relevé de l’état déclaré par dpkg, pas un diagnostic complet de cohérence.

Pour enregistrer le résultat depuis un shell Bash dans un nouveau fichier :

(
  set -o noclobber
  set -o pipefail
  dpkg-query -W -f='${db:Status-Status}\t${binary:Package}\t${Version}\t${Architecture}\n' \
    | awk -F '\t' '$1 == "installed" { print $2 "\t" $3 "\t" $4 }' \
    | LC_ALL=C sort > installed-packages.tsv
)

noclobber refuse d’écraser un fichier déjà existant ; choisissez un autre nom pour un nouveau relevé. pipefail signale aussi l’échec d’une commande en amont du tri. Si la commande échoue, un fichier vide ou partiel peut rester : ne l’utilisez pas comme inventaire valide. Les options sont limitées au sous-shell entre parenthèses.

Conservez deux relevés sous des noms distincts, par exemple avant et après une intervention, puis comparez-les :

diff -u installed-packages-before.tsv installed-packages-after.tsv

Le tri en locale C rend l’ordre reproductible. Un code de retour 1 de diff indique des différences, pas une erreur de lecture ; un code supérieur signale un problème. L’inventaire ne restaure ni données, ni configurations, ni définitions de dépôts. Une autre version d’Ubuntu peut ne pas proposer les mêmes versions de paquets.

Compléter l’inventaire avec les Snaps

Les commandes APT et dpkg ne décrivent pas tous les logiciels présents. Les paquets Snap ont leur propre inventaire :

snap list

Si snap n’est pas disponible ou si son service n’est pas accessible, analysez ce contexte avant de considérer la liste comme vide. La documentation Snap sur les premiers usages présente les colonnes de version et de révision.

Complétez selon l’environnement : applications Flatpak, images de conteneurs, environnements Python, autres gestionnaires de langages et installations manuelles. Un paquet Deb peut aussi servir de transition vers une autre méthode de distribution ; sa présence ne garantit pas que tous les fichiers applicatifs figurent dans son inventaire.

Choisir la commande selon la question

Question Commande ou critère
Quels Deb sont installés ? apt list --installed
Ce paquet est-il installé ? dpkg-query -s nom puis vérifier l’état, ou lire db:Status-Status.
Quelle version APT choisirait-il ? apt-cache policy nom
Quels fichiers le paquet enregistre-t-il ? dpkg-query -L nom
Quel paquet enregistre ce chemin ? dpkg-query -S /chemin
Quels paquets sont marqués manuels ? apt-mark showmanual
Quels Snaps sont installés ? snap list

Un inventaire ne dit pas si le service associé fonctionne. Vérifiez séparément un service identifié avec systemctl status nom-du-service. Pour une décision de suppression, examinez aussi les dépendances et l’usage réel du logiciel, au lieu de déduire son utilité de son seul nom.