apt-get remove avec les caractères génériques supprimés beaucoup plus que prévu. Pourquoi?

33

Hier soir, j'essayais de graver des CD. En étant agacé par k3b et en choisissant d'utiliser brasero à la place, je suis allé supprimer k3b. J'ai tapé:

sudo apt-get remove k3b

Je tape sur l'onglet deux fois et j'ai vu que j'avais les données k3b et k3b sur mon système. En supposant que je n'aurais pas besoin de k3b-data sur mon système sans k3b, je voulais aussi le supprimer, donc j'ai tapé:

sudo apt-get remove k3b*

Malheureusement, je tape Y pour confirmer sans regarder. Il a désinstallé beaucoup plus que les données k3b et k3b. Il a désinstallé les paquets qui ne correspondaient pas à ma regex "k3b *". Par exemple: transmission et gestionnaire de réseau

Je suis assez certain que je n’avais pas d’espace entre k3b et * mais je ne sais pas pourquoi cela enlèverait tout ce qu’il a fait. Y a-t-il quelque chose à propos d'apt-get que je ne comprends pas?

    
posée Steve Goykovich 02.11.2012 - 15:03
la source

4 réponses

32

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

  • Vous avez besoin de .* pour faire correspondre un caractère, un nombre quelconque de fois
  • Vous avez besoin de ^ pour faire correspondre le début de la chaîne
  • Vous devez citer la regex pour empêcher bash d’interpréter * en tant que joker

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

    
réponse donnée Boris 19.08.2014 - 20:36
la source
27

L'expression régulière * représente zéro ou arbitrairement beaucoup. Donc, vous avez dit apt-get à supprimer tout ce qui contient k3 suivi de n'importe quel nombre de b , donc fondamentalement tout ce qui contient k3 . Si je tente 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.
    
réponse donnée qbi 02.11.2012 - 15:13
la source
4

Utilisez plutôt sudo apt-get remove ^k3b . Lorsque vous installez ou supprimez des packages, * est souvent dangereux et rarement nécessaire. Si vous utilisez * , vous devriez le citer, mais pas ne le rend pas 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 apt et apt-get l'interprète et pas un effet de extension de chemin .

  • Même les utilisations sûres de * sont souvent inutile .
  • Les utilisations non sécurisées sont brutales . La suppression de k3b* supprime tous les packages contenant k3 n'importe où dans son nom (et tous les paquets qui en dépendent). Ce n'est pas une faute de frappe - contenant k3 suffit, même sans b , car b* signifie "zéro ou plus b s."

Lorsque vous exécutez apt ou apt-get avec l'action install , remove ou purge , chacune L'argument suivant est d'abord 1 interprété comme le nom d'un package individuel. Si un paquet avec ce nom exact existe, l'action est effectuée pour cela.

S'il n'y en a pas, apt et apt-get vérifieront si l'argument contient l'un des expression régulière metacharacters 2 . , ? , + , * , | , \[ , < a href="http://www.regular-expressions.info/anchors.html"> ^ ou $ . Sinon, c'est fait - aucun paquet n'a été trouvé.

S'il contient l'un de ces caractères, il est traité comme une expression régulière et associé à n'importe quelle partie de n'importe quel nom de package. Il ne doit pas nécessairement correspondre au nom entier. Comme d'autres l'ont déjà dit, * dans une expression régulière ne signifie pas la même chose que * dans un glob. ? non plus. Dans une expression régulière:

  • * permet à l'élément précédent d'apparaître autant de fois - y compris une seule fois ou pas du tout-- au lieu de exactement une fois.
  • ? rend l'élément précédent facultatif - c'est-à-dire qu'il lui permet d'apparaître zéro ou une fois. / li>

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

  

Si aucun paquet ne correspond à l'expression donnée et que l'expression contient   un des '.', '?' ou '*' alors il est supposé être un POSIX ordinaire   expression, et il est appliqué à tous les noms de package de la base de données.   Toutes les correspondances sont alors installées (ou supprimées). Notez que la correspondance est   fait par sous-chaîne donc 'lo. *' correspond à 'how-lo' et 'lower'. Si c'est   indésirable, ancre l'expression régulière avec un caractère '^' ou '$',   ou créer une expression régulière plus spécifique.

La page de manuel ne mentionne que . , ? et * , mais elle est incomplète , sous la forme + , | , [ , ^ et $ suffit également à laisser apt-get ou apt interpréter le modèle comme une expression régulière. 3

Bien que vous puissiez faire correspondre n'importe quel nombre de caractères avec .* - non juste * - vous n'en avez besoin que s'il apparaît dans le middle de votre expression régulière. Étant donné que le modèle correspond à une sous-chaîne d’un nom de package, il est inutile à la fin (ou au début) du modèle.

La page de manuel mentionne ^ et $ . Celles-ci (en particulier ^ ) sont essentielles à l'écriture de modèles sûrs et efficaces à utiliser avec les actions install , remove ou purge dans apt ou apt-get .

  • ^ ancre une expression régulière dans le début de la chaîne entière. ^k3b sélectionne tous les packages dont les noms start avec k3b .
  • $ ancre une expression régulière à la fin de la chaîne entière. k3b$ sélectionnerait tous les packages dont les noms end avec k3b .

Par conséquent, vous pouvez utiliser cette commande pour supprimer les packages en toute sécurité:

sudo apt-get remove ^k3b

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

sudo apt-get remove k3b k3b-data

Alors vous évitez toute cette complexité! (Bien que l'ancrage avec ^ soit simple une fois que vous y êtes habitué) ou utilisez extension d'accolade , que votre shell développe dans la commande ci-dessus:

sudo apt-get remove k3b{,-data}

1 Il existe deux exceptions à cela: (a) certaines options (par exemple, -f , --purge ) sont reconnus, et (b) certains caractères de ponctuation apparaissant à la fin d'un argument qui serait autrement considéré comme un nom de package pour effectuer l'action peuvent être utilisés pour modifier ce qui est fait (par exemple, sudo apt install ubuntu-desktop^ installe la tâche plutôt que le paquet, et quand ^ apparaît à la fin ).

2 D'autres métacaractères d'expression régulière existent. Par exemple, \ est pris en charge par tous les dialectes des expressions régulières et couramment utilisés. . , ? , + , * , | , [ , ^ et $ se trouvent être les métacaractères que les développeurs APT ont décidé d'interpréter comme une expression régulière ( après résolution comme un package exact nommé a échoué).

3 Le moyen le plus simple de le vérifier est de simuler l’installation ou la suppression avec un tel modèle, en utilisant l’option -s décrite ci-dessus. Par exemple, l'exécution de apt -s install ^virtualbox indique que sudo apt install ^virtualbox aurait pour effet d'essayer d'installer tous les packages connus du gestionnaire de packages dont le nom commence par virtualbox . Toutefois, ce comportement peut également être vérifié en examinant le code source . Vérifiez la fonction CacheSetHelper::PackageFromRegEx dans cacheset.cc .

    
réponse donnée Eliah Kagan 19.09.2017 - 21:53
la source
1

Vous supprimez probablement plus une lib qui contenait k3b sur laquelle ces programmes dépendaient.

En bref, vous ne le saurez peut-être jamais. Je recommande de ne pas utiliser de caractère générique pour supprimer des éléments et lire des éléments lorsque vous y êtes invité (désolé).

De plus, avec les recherches -n regex, utilisez tous les champs et pas seulement les noms

lien

également qbi est correct, votre regex est imparfaite dès le départ

    
réponse donnée coteyr 02.11.2012 - 15:17
la source

Lire d'autres questions sur les étiquettes