vendredi 26 février 2021

Désinstallation multiple

Je suis dans openSUSE, distribution basée sur le système de paquets rpm. J'ai installé un programme dont je ne veux plus.

La commande

sudo zypper remove -u nom-du-programme 

va désinstaller le programme en question et toutes les dépendances venues avec lui et qui sont maintenant inutiles.

Très bien, mais si j'ai effectué de nombreuses installations et que je veux revenir en arrière?

La commande

rpm -qa --last | more

permet de lister les derniers programmes installés, mais elle n'est pas très pratique ne serait-ce que pour en extraire le nom des paquets. 
Il est préférable d'utiliser la commande suivante:

rpm -qa --queryformat "%{INSTALLTIME} %{INSTALLTIME:date} %{NAME}\n" | sort -r  | awk '{print NR,$0}' | more

Le premier INSTALLTIME est nécessaire pour le tri (commande sort). La date (et l'heure) aident à déterminer quels sont les paquets à désinstaller. La géniale commande awk permet d'afficher un numéro de ligne. On peut donc déterminer que les paquets à désinstaller se trouve entre un numéro NR minimum (par exemple 6) et un numéro maximum (par exemple 58);
Il reste à procéder:

rpm -qa --queryformat "%{INSTALLTIME} %{NAME}\n" | sort -r  | awk 'NR==6,NR==58 {print $2}' | xargs sudo zypper remove

La première partie de la commande (avant | xargs) donne simplement la liste des paquets qui vont être désinstallés. En effet la ligne reçue par awk (désignée par $0) comprend deux champs ($1 et $2 séparés par un espace). xargs transmet cette liste de paquets à zypper, en tant qu'arguments.
Après le lancement de la commande, il est encore possible de refuser la changement:


il est important de vérifier le nombre de paquets qui vont être supprimés. Certains paquets sont peut-être devenus indispensables pour d'autres paquets installés ultérieurement: dans ce cas, ceux-ci seront aussi supprimés.
A part zypper, toutes les autres commandes sont indépendantes de la distribution, pourvu qu'elle utilise le système de paquets rpm.
Ainsi par exemple pour Fedora la commande serait:

rpm -qa --queryformat "%{INSTALLTIME} %{NAME}\n" | sort -r  | awk 'NR==6,NR==58 {print $2}' | xargs -o sudo dnf remove

Cependant pour Fedora, il est de loin préférable de travailler autrement. Chaque ensemble d'installations correspond à une transaction.

dnf history list

permet de repérer le ou les numéros des transactions à défaire.

dnf history info numéro

affiche les détails d’une transaction.

dnf history undo numéro

désinstalle les paquets installés lors de la transaction.