Pour vérifier cela, voici un petit script Python qui exécute les deux commandes suivantes :

$ dpkg --get-selections
$ apt-show-versions -b

et en compare les paquets listés à chaque fois. Il faut bien sûr avoir installé apt-show-versions au préalable. Le résultat montre, on pouvait s'y attendre, que dpkg retourne quelques paquets supplémentaires. En effet les paquets installés manuellement ne sont pas listés par apt. Néanmoins d'autres paquets supplémentaires pourtant installés par apt-get apparaissent, comme quoi la méthode n'est pas parfaite !

Le script Python

Le principe du script est on ne peut plus simple :

  • le texte retourné par chaque commande est transformé en liste car chaque ligne contient le nom d'un paquet
  • les listes sont triées pour en faciliter la lecture
  • les listes sont comparées
  • la liste retournée par apt est enregistrée dans un fichier texte afin d'être utilisée pour installer un nouveau système
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
#
# compare les listes de paquets obtenues avec :
#  $ dpkg --get-selections
# et 
#  $ apt-show-versions -b

# importations
import commands, string

# charger la liste selon dpkg
Dpkg = commands.getoutput('dpkg --get-selections').split('\n')
Dpkg = filter(lambda x: x[-8:]=='\tinstall', Dpkg)
Dpkg = [x.split('\t')[0] for x in Dpkg]
Dpkg.sort()

# charger la liste selon apt
Apt = commands.getoutput('apt-show-versions -b').split('\n')
Apt = [x.split('/')[0] for x in Apt]
Apt.sort()

# chercher les paquets dpkg absents de apt
DpkgNotInApt = []
for Name in Dpkg:
	if Name not in Apt:
		DpkgNotInApt.append(Name)

# chercher les paquets apt absents de dpkg
AptNotInDpkg = []
for Name in Apt:
	if Name not in Apt:
		AptNotInDpkg.append(Name)

# afficher les résultats
if len(DpkgNotInApt):
	print "> Paquets 'dpkg' non listés par 'apt' :\n\t%s" % string.join(DpkgNotInApt, '\n\t')
	print "  Ce sont des paquets installés manuellement ?\n"
else:
	print "> Tous les paquets 'dpkg' sont dans 'apt'\n"
if len(AptNotInDpkg):
	print "> Paquets 'apt' non listés par 'dpkg' :\n\t%s" % string.join(AptNotInDpkg, '\n\t')
else:
	print "> Tous les paquets 'apt' sont dans 'dpkg'"

# enregistrer les paquets à installer avec apt
f = open('apt-install-list.txt', 'w')
f.writelines([x+'\n' for x in Apt])
f.close()
print "> Liste des paquets à installer avec 'apt' enregistrée dans 'apt-install-list.txt'"
print "  Commande : 'apt-get install < apt-install-list.txt'"