La nuit dernière, j'essayais de graver des CD. Étant contrarié par k3b et choisissant plutôt d’utiliser brasero, j’ai décidé de supprimer k3b.
J'ai tapé dans:
sudo apt-get remove k3b
J'ai frappé l'onglet deux fois et j'ai vu que j'avais à la fois des 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, aussi j'ai entré:
sudo apt-get remove k3b*
Malheureusement, je frappe Y pour confirmer sans regarder. Il a désinstallé beaucoup plus que k3b
et k3b-data
. Il a désinstallé les paquets qui ne correspondaient pas à ma k3b*
regex. Par exemple: transmission
et network-manager
.
Je suis à peu près certain que je n'ai pas d'espace entre k3b
et *
mais je ne sais pas pourquoi sinon cela supprimerait tout ce qu'il a fait. Y a-t-il quelque chose à propos d'apt-get que je me suis mal compris?
la source
Réponses:
La commande que vous voulez est
sudo apt-get remove '^k3b.*'
parce que:.*
faire correspondre n'importe quel caractère, n'importe quel nombre de fois^
faire correspondre le début de la chaîne*
comme un caractère générique.(Cette réponse complète et résume les informations précédentes fournies par qbi et Flimm)
la source
.*
. Vous pouvez simplement utilisersudo apt-get remove ^k3b
. La présence de^
est suffisante pour provoquer l'argument à interpréter comme une expression régulière, et quandapt
ouapt-get
interprète un argument comme une expression régulière, il lui correspond partout dans le nom du package. C'est pourquoi vous avez besoin^
- d' ancrer la correspondance au début du nom du paquet. L'expression régulière n'a pas besoin de correspondre au nom complet du package, à n'importe quelle partie de celui-ci.^
, alors vous n'en avez pas besoin.*
)L'expression régulière
*
représente zéro ou arbitrairement plusieurs. Donc, vous avez ditapt-get
de supprimer tout ce qui contientk3
suivi de n'importe quel nombre deb
, donc tout ce qui contientk3
. Si j'essaie votre commande sur mon système, il veut supprimer 58 paquets.la source
*
ne fonctionne comme un joker pour bash comme dans DOS, mais certaines des commandes commeapt-get
attendre une expression régulière. Lorsque vous tapezsudo apt-get remove -s k3b*
, bash commence par rechercher les fichiers de votre répertoire actuel commençant park3b
. S'il en trouve, il remplacera cet argument par ces noms de fichiers. Sinon, il passerak3b*
directement àapt-get
qui l'interprétera comme une regex. Si vous ne voulez pas que bash interprète d'abord l'astérisque comme un caractère générique (ce que vous n'avez probablement pas), entourez l'argument par des guillemets simples, comme ceci:sudo apt-get remove -s 'k3b*'
sudo apt-get remove -s 'k3b.*'
. Je suis tombé par hasard sur cette réponse et trouve qu'il est vraiment important de savoir. IMHO c'est assez inattendu et je le marquerais plutôt comme un bogue de "comportement inattendu" d'apt-get ... vous attendez normalement un sens "glob" et pas un sens "regexp" s'il n'est pas spécifié. Merci quand même et +1!-s
option signifie "simulation". Il vous dit deapt-get
ne pas effectuer l'opération, mais simplement de vous informer de ce qui se passerait sans l'-s
option.Utilisez à la
sudo apt-get remove ^k3b
place. Lorsque vous installez ou supprimez des paquetages, cela*
est souvent dangereux et rarement nécessaire. Si vous utilisez*
, vous devriez citer, mais cela ne pas le rendre plus sûr, parce que sa tendance à choisir des paquets beaucoup plus que vous avez l' intention est le résultat de la manièreapt
et l'apt-get
interpréter et non un effet de l' expansion du chemin .*
sont souvent inutiles .k3b*
supprime chaque paquet qui contientk3
n'importe où dans son nom (et chaque paquet qui dépend d'un tel paquet). Ce n'est pas une faute de frappe - contenirk3
est suffisant, même sans leb
, parce queb*
signifie "zéro ou plus deb
s".Lorsque vous exécutez
apt
ouapt-get
avec leinstall
,remove
ou l'purge
action, chaque argument ultérieur est d' abord 1 interprété comme le nom d'un emballage individuel. S'il existe un package portant exactement ce nom, l'action est effectuée sur celui-ci.S'il n'y a pas tel paquet,
apt
etapt-get
vérifiera si l'argument contient l' une des communes expression régulière métacaractères 2.
,?
,+
,*
,|
,\[
,^
ou$
. Sinon, c'est fait - aucun paquet n'a été trouvé.Si elle ne contient aucun de ces caractères, il est traité comme une expression régulière et en correspondance avec une partie d'un nom de package. Il ne doit pas nécessairement correspondre au nom complet. Comme d'autres l'ont déjà dit, l'
*
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 que nécessaire - 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’il lui permet d’apparaître zéro ou une fois.apt-get (8) (
man apt-get
) dit:La page de manuel mentionne seulement
.
,?
et*
, mais il est incomplet , comme+
,|
,[
,^
et$
sont également suffisantes pour laisserapt-get
ouapt
interpréter le motif comme une expression régulière. 3Bien que vous puissiez faire correspondre un nombre quelconque de caractères avec
.*
- pas seulement - vous n'en*
avez besoin que s'il apparaît au milieu de votre expression régulière. Comme le modèle correspond à n'importe quelle 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$
. Ceux - ci ( en particulier^
) sont essentielles à l' écriture des motifs sécuritaires et efficaces pour une utilisation avec lesinstall
,remove
oupurge
actionsapt
ouapt-get
.^
ancre une expression régulière au début de la chaîne entière.^k3b
sélectionne tous les paquets dont le nom commence park3b
.$
ancre une expression régulière à la fin de la chaîne entière.k3b$
sélectionnerait tous les paquets dont le nom se termine park3b
.Par conséquent, vous pouvez utiliser cette commande pour supprimer les packages en toute sécurité:
Enfin, dans le cas spécifique que vous avez mentionné, vous pourriez aussi bien donner les deux noms vous-même:
Alors vous évitez toute cette complexité! (Bien que l'ancrage avec
^
soit simple une fois que vous y êtes habitué.) Ou utilisez le développement d'accolade , que votre shell développe dans la commande ci-dessus:1 Il y a 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 exécuter l'action peut être utilisé 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 Il existe d'autres métacaractères d'expression régulière. Par exemple,
\
est pris en charge par tous les dialectes d'expressions régulières et couramment utilisés..
,?
,+
,*
,|
,[
,^
, Et$
Il se trouve que les métacaractères les développeurs APT ont décidé déclencherait l' interprétation comme une expression régulière (après résolution comme un paquet exact nommé a échoué).3 Le moyen le plus simple de vérifier cela consiste à simuler l'installation ou la suppression à l'aide d'un tel motif, en utilisant l'
-s
option décrite ci-dessus. Par exemple, l'exécution deapt -s install ^virtualbox
shows quisudo apt install ^virtualbox
aurait pour effet d'essayer d'installer chaque paquet connu du gestionnaire de paquets dont le nom commence parvirtualbox
. Toutefois, ce comportement peut également être vérifié en examinant le code source . Vérifiez laCacheSetHelper::PackageFromRegEx
fonction danscacheset.cc
.la source
Vous supprimez plus probablement une bibliothèque contenant k3b et sur laquelle reposent ces programmes.
En bref, vous ne 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 -n, les recherches regex utilisent tous les champs et pas seulement les noms
http://ccrma.stanford.edu/planetccrma/man/man8/apt-cache.8.html
aussi qbi est correct votre regex est imparfait dès le départ
la source
apt-get remove
, mais parapt-get cache
. Il semble qu’en fait,apt-get remove
ne cherche que les noms de paquets, pas les descriptions.