Ignorer les packages qui ne sont pas actuellement installés lors de l'utilisation de «apt-get remove»

15

J'ai un scénario dans lequel j'aimerais supprimer un ensemble de packages qui peuvent ou non être installés, et j'aimerais apt-get pour supprimer ceux qui sont et ignorer silencieusement ceux qui ne le sont pas. Quelque chose comme:

apt-get remove foo bar baz

qui, si foo et bar étaient installés mais pas baz, supprimeraient foo et bar sans se plaindre de baz. Y a-t-il un moyen de faire cela?

Les choses que j'ai essayées n'ont pas fonctionné, avec cups-dbg comme mon bouc émissaire réellement installé à supprimer:

jcp@a-boyd:~$ sudo apt-get remove -y cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

jcp@a-boyd:~$ sudo apt-get remove --ignore-missing cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

jcp@a-boyd:~$ sudo apt-get remove --fix-broken cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

Je sais que je pourrais le faire avec un script shell et de la dpkg --listmagie, mais j'aimerais éviter toute complexité qui n'est pas absolument nécessaire.

javawizard
la source
Cette réponse a finalement fonctionné pour moi . Fix stupide pour un problème stupide. Notez qu'il y a en fait un défaut sur Launchpad à ce sujet, alors n'hésitez pas à contribuer.
Jeff

Réponses:

8

Revenir à un outil de niveau inférieur tel que dpkg est-il une option?

dpkg --remove foo bar libperl-dev
dpkg: warning: ignoring request to remove foo which isn't installed
dpkg: warning: ignoring request to remove bar which isn't installed
(Reading database ... 169132 files and directories currently installed.)
Removing libperl-dev ...

Pour supprimer les fichiers de configuration des packages, utilisez la purge comme ci-dessous

dpkg --purge foo bar libperl-dev
barti_ddu
la source
1
J'aurais dû mentionner que les paquets à supprimer peuvent avoir des dépendances inverses, et j'aimerais que ceux-ci soient supprimés aussi. Apt-get est donc bien meilleur que dpkg, mais j'accepterai votre réponse car il semble qu'il n'y ait pas vraiment de meilleure façon de le faire.
javawizard
7

J'utilise apt-get remove --purge(aka apt-get purge) pour la dépendance qui suit avec une liste de packages. Pour gérer les packages qui n'existent pas, je filtre les packages qui ne sont pas installés avec le script suivant.

pkgToRemoveListFull="cups-dbg bogus-package"
pkgToRemoveList=""
for pkgToRemove in $(echo $pkgToRemoveListFull); do
  $(dpkg --status $pkgToRemove &> /dev/null)
  if [[ $? -eq 0 ]]; then
    pkgToRemoveList="$pkgToRemoveList $pkgToRemove"
  fi
done
apt-get --yes --purge remove $pkgToRemoveList
Lucas
la source
3

Pour Debian ≤ 9, il est possible d'utiliser simplement aptitudeau lieu de apt-get:

sudo aptitude remove -y cups-dbg bogus-package

Aptitude affiche des avertissements, mais continue néanmoins de supprimer vos packages:

Couldn't find any package whose name or description matched "bogus-package"
...
Removing cups-dbg ...
...

Si vous souhaitez purger (supprimer les fichiers de configuration de package) plutôt que supprimer (conserver les fichiers de configuration), notez que aptitudepurge uniquement les packages directement fournis, tandis que les dépendances inutilisées sont uniquement supprimées. Cependant, vous pouvez purger tous les packages supprimés dans une deuxième étape:

apt-get -y purge $(dpkg -l | grep ^rc | awk '{print $2}')
vog
la source
D'accord. parfois, le bogus-packagejuste avait le mauvais nom. donc, au cas où nous aurions comme 500 paquets, il serait préférable d'analyser les faux paquets aussi et de faire quelques astuces (par exemple, des chiffres après le nom manquant, etc. donc, pouvez-vous s'il vous plaît donner quelques conseils sur la façon de le faire ..
nyxee
@nyxee Je propose de poser cette question comme une nouvelle question, en indiquant exactement ce que vous voulez réaliser.
vog
1
Ce serait une bonne solution de contournement sauf 1) aptitude n'est plus installé par défaut sur Ubuntu 18.04 et 2) aptitude a une façon assez différente (on pourrait dire bizarre) de gérer les caractères génériques.
Jeff
Cela ne fonctionne pas pour moi sur Debian 10. Je vois,Couldn't find any package whose name or description matched 'QUX' Unable to apply some actions, aborting
pdoherty926
@ pdoherty926 Merci pour l'astuce. J'ai vérifié cela et ajusté ma réponse en conséquence.
vog
0

Un autre petit 2 lignes si quelqu'un a besoin d'utiliser apt:

purge_packages () {
  matchedPackages="$(echo "$(apt list --installed $* 2>/dev/null)" | grep -v '^Listing\.\.\.' | sed -s 's|[/ ].*||' | tr '\n' ' ' | sed 's/ *$//;s/^ *//')"
  [[ -n "$matchedPackages" ]] && apt purge -yq $matchedPackages
}

Explication:

apt list --installed $*         # Lists packages matched from function args, the --installed flag limits results to installed packages

2>/dev/null                     # Disregard the warning about using this command in a script

grep -v '^Listing\.\.\.'        # Remove the first line of output that says "Listing..." or "Listing... Done"

sed -s 's|[/ ].*||'             # Remove the rest of the line after the package name (I'm checking for / or space though it looks like just the slash is needed but package names will never have a space)

tr '\n' ' '                     # Put it all on one line separated by spaces

sed 's/ *$//;s/^ *//'           # Remove trailing and leading spaces from the line so it will be blank during the test next line if nothing was matched

[[ -n "$matchedPackages" ]]     # Check if any packages were matched

apt purge -yq $matchedPackages  # Purge them!
Meir
la source
Bienvenue sur SuperUser! Souhaitez-vous ajouter plus de description à votre réponse quant à ce que fait votre script et comment il le fait?
El8dN8
@ El8dN8 Ajout d'explication
Meir