50 votes

apt-get remove with wildcard a supprimé beaucoup plus que prévu. pourquoi ?

Hier soir, j'ai essayé de graver des CD. Comme j'étais ennuyé par k3b et que j'avais choisi d'utiliser brasero à la place, j'ai voulu supprimer k3b.

J'ai tapé :

sudo apt-get remove k3b

J'ai appuyé deux fois sur la touche tab et j'ai vu que j'avais à la fois k3b et k3b-data sur mon système. En supposant que je n'aurais pas besoin de k3b-data sur mon système sans k3b, j'ai voulu le supprimer également et j'ai donc tapé :

sudo apt-get remove k3b*

Malheureusement, j'ai appuyé sur Y pour confirmer sans regarder. Il a désinstallé beaucoup plus que k3b y k3b-data . Il a désinstallé les paquets qui ne correspondaient pas à mes besoins. k3b* regex. Par exemple : transmission y network-manager .

Je suis à peu près certain que je n'ai pas mis d'espace entre k3b y * mais je ne sais pas pourquoi il supprimerait tout ce qu'il a fait. Est-ce qu'il y a quelque chose à propos d'apt-get que je ne comprends pas ?

65voto

Boris Dalstein Points 810

La commande souhaitée est la suivante sudo apt-get remove '^k3b.*' car :

  • Vous avez besoin .* pour faire correspondre n'importe quel caractère, n'importe quel nombre de fois
  • Vous avez besoin ^ pour correspondre au début de la chaîne
  • Vous devez citer la regex pour éviter que bash n'interprète * comme joker

(Cette réponse complète et résume les informations fournies précédemment par qbi et Flimm)

38voto

cbp Points 229

L'expression régulière * représente zéro ou un nombre arbitraire. Vous avez donc dit à apt-get de supprimer tout ce qui contient k3 suivi d'un nombre quelconque de b Donc, en gros, tout ce qui contient des k3 . Si j'essaie votre commande sur mon système, il veut supprimer 58 paquets.

sudo apt-get remove -s k3b*
Package k3b is not installed, so not removed
Package k3b-data is not installed, so not removed
Package k3b-dbg is not installed, so not removed
Package libcanberra-gtk3-0 is not installed, so not removed
Package libcanberra-gtk3-0-dbg is not installed, so not removed
Package libcanberra-gtk3-dev is not installed, so not removed
…
The following packages will be REMOVED:
  appmenu-gtk ardour audacity brasero brasero-cdrkit firefox-globalmenu
  gconf-editor gir1.2-appindicator-0.1 gnome-applets gnome-control-center
…
0 upgraded, 2 newly installed, 58 to remove and 0 not upgraded.

12voto

Eliah Kagan Points 111731

Utilice sudo apt-get remove ^k3b au lieu de cela. Lorsque vous installez ou supprimez des paquets, * est souvent dangereuse et rarement nécessaire. Si vous utilisez * Il faut le citer, mais cela n'a pas d'importance. pas le rendre plus sûr, car sa tendance à sélectionner beaucoup plus de paquets que vous ne le souhaitez est le résultat de la façon dont il est utilisé. apt y apt-get l'interpréter et pas un effet de expansion du chemin d'accès .

  • Même les utilisations sûres de * sont souvent inutile .
  • Utilisations dangereuses sont brutales . Suppression k3b* supprime tous les paquets qui contiennent k3 n'importe où dans son nom (et tout paquet qui dépend d'un tel paquet). Il ne s'agit pas d'une faute de frappe : contenir k3 est suffisante, même sans le b parce que b* signifie "zéro ou plusieurs b s."

Lorsque vous exécutez apt ou apt-get avec le install , remove ou purge chaque argument suivant est d'abord 1 interprété comme le nom d'un paquet individuel. S'il existe un paquet portant ce nom exact, l'action est exécutée pour ce paquet.

S'il n'existe pas de paquet de ce type, apt y apt-get vérifiera si l'argument contient l'un des éléments suivants expression régulière métacaractères 2 . , ? , + , * , | , [\[](http://www.regular-expressions.info/charclass.html) , ^ ou $ . Si ce n'est pas le cas, c'est terminé - aucun paquet n'a été trouvé.

S'il fait contient l'un de ces caractères, elle est traitée comme une expression régulière et comparée à l'expression toute partie de n'importe quel nom de paquet. Il n'est pas nécessaire qu'il corresponde au nom entier. Comme d'autres l'ont dit, * dans une expression régulière ne signifie pas la même chose que * en un seul bloc. ? ne le fait pas non plus. Dans une expression régulière :

  • * permet d'afficher l'élément précédent un nombre quelconque de fois --y compris une seule fois ou pas du tout, au lieu d'une seule fois.
  • ? rend l'élément précédent facultatif --c'est-à-dire qu'elle lui permet d'apparaître zéro ou une fois.

apt-get(8) ( man apt-get ) dit :

Si aucun paquet ne correspond à l'expression donnée et que l'expression contient l'un des éléments suivants : '.', '?' ou '*', on suppose qu'il s'agit d'une expression régulière POSIX et elle est appliquée à tous les noms de paquetages de la base de données. Tous les paquets correspondants sont alors installés (ou supprimés). Notez que la correspondance est par sous-chaîne, donc 'lo.*' correspond à 'how-lo' et 'lowest'. Si l'expression est indésirable, ancrez l'expression régulière avec un caractère '^' ou '$', ou créez une expression régulière plus spécifique.

La page de manuel ne mentionne que . , ? et * pero il est incomplet , comme + , | , [ , ^ et $ sont également suffisants pour que apt-get ou apt interprète le motif comme une expression régulière. 3

Bien que vous puissiez faire correspondre n'importe quel nombre de caractères avec .* -- pas juste * --Vous n'avez besoin de cette information que si elle apparaît dans la liste de contrôle. milieu de votre expression régulière. Comme le motif est comparé à n'importe quelle sous-chaîne du nom d'un paquet, il est inutile à la fin (ou au début) du motif.

La page de manuel mentionne ^ y $ . Ceux-ci (en particulier les ^ ) sont essentiels pour écrire des modèles sûrs et efficaces à utiliser avec le programme install , remove ou purge actions en apt ou apt-get .

  • ^ ancre une expression régulière dans le champ début de l'ensemble de la chaîne. ^k3b sélectionne tous les paquets dont les noms commencer con k3b .
  • $ ancre une expression régulière dans le champ fin de l'ensemble de la chaîne. k3b$ sélectionnerait tous les paquets dont les noms fin con k3b .

Vous pouvez donc utiliser cette commande pour supprimer les paquets en toute sécurité :

sudo apt-get remove ^k3b

Enfin, dans le cas spécifique que vous avez mentionné, vous pourriez tout aussi bien transmettre les deux noms vous-même :

sudo apt-get remove k3b k3b-data

Vous évitez ainsi toute cette complexité ! (Bien que l'ancrage avec ^ est simple une fois que l'on s'y est habitué). Ou utilisez expansion de l'orthèse que votre Shell développe en la commande ci-dessus :

sudo apt-get remove k3b{,-data}

1 Il existe deux exceptions à cette règle : <em>(a) </em>certaines options (par exemple, <code>-f</code> , <code>--purge</code> ) sont reconnues, et <em>(b) </em>certains caractères de ponctuation apparaissant au <em>fin </em>d'un argument qui serait autrement pris comme nom de paquet pour effectuer l'action peut être utilisé pour modifier ce qui est fait (par exemple, <code>sudo apt install ubuntu-desktop^</code> installe le <a href="https://askubuntu.com/a/249373/22949">tâche </a>plutôt que le paquet, et lorsque <code>^</code> apparaît à la fin).

2 Il existe d'autres métacaractères d'expression régulière. Il existe d'autres métacaractères d'expression régulière, <code>\</code> est supporté par tous les dialectes d'expressions régulières et est couramment utilisé. <code>.</code> , <code>?</code> , <code>+</code> , <code>*</code> , <code>|</code> , <code>[</code> , <code>^</code> et <code>$</code> se trouvent être les métacaractères dont les développeurs d'APT ont décidé qu'ils déclencheraient l'interprétation en tant qu'expression régulière (après l'échec de la résolution en tant que nom de paquet exact).

3 La façon la plus simple de le vérifier est de simuler l'installation ou la suppression d'un tel modèle, en utilisant la fonction <code>-s</code> comme décrit ci-dessus. Par exemple, en exécutant <code>apt -s install ^virtualbox</code> montre que <code>sudo apt install ^virtualbox</code> aurait pour effet de tenter d'installer tous les paquets dont le gestionnaire de paquets a connaissance et dont le nom commence par <code>virtualbox</code> . Toutefois, ce comportement peut également être vérifié en examinant les éléments suivants <a href="https://git.launchpad.net/apt/tree/?h=1.2.y" rel="nofollow noreferrer">le code source </a>. Vérifier les <code>CacheSetHelper::PackageFromRegEx</code> fonction dans <a href="https://git.launchpad.net/apt/tree/apt-pkg/cacheset.cc?h=1.2.y" rel="nofollow noreferrer"><code>cacheset.cc</code></a> .

1voto

coteyr Points 16560

Vous avez probablement supprimé une librairie qui contenait k3b et dont ces programmes dépendaient.

En bref, vous ne le saurez peut-être jamais. Je recommande de ne pas utiliser de caractères génériques pour supprimer des éléments et de lire les éléments lorsque l'on vous le demande (désolé).

De plus, sans l'option -n, les recherches par expressions rationnelles utilisent tous les champs et pas seulement les noms.

http://ccrma.stanford.edu/planetccrma/man/man8/apt-cache.8.html

De plus, qbi a raison, votre regex est défectueuse dès le départ.

1voto

Thach Van Points 111

Utilisez .* au lieu de *, et mettez des guillemets ' ' à l'intérieur.

sudo apt-get remove 'k3b.*'

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X