Anoche estaba intentando grabar CD. Estando molesto con k3b y optando por usar brasero en su lugar, fui a eliminar k3b.
Escribí en:
sudo apt-get remove k3b
Presioné la tecla dos veces y vi que tenía datos k3b y k3b en mi sistema. Suponiendo que no necesitaría k3b-data en mi sistema sin k3b, también quería eliminarlo, así que escribí:
sudo apt-get remove k3b*
Lamentablemente presioné Y para confirmar sin mirar. Desinstaló mucho más que k3b
y k3b-data
. Desinstaló paquetes que no se ajustaban a mi k3b*
expresión regular. Por ejemplo: transmission
y network-manager
.
Estoy bastante seguro de que no tuve un espacio entre k3b
y, *
pero no sé por qué más eliminaría todo lo que hizo. ¿Hay algo sobre apt-get que no entiendo?
apt
package-management
regex
Steve Goykovich
fuente
fuente
Respuestas:
El comando que quieres es
sudo apt-get remove '^k3b.*'
porque:.*
hacer coincidir cualquier personaje, cualquier cantidad de veces^
hacer coincidir el inicio de la cadena*
como un comodín(Esta respuesta completa y resume la información previa proporcionada por qbi y Flimm)
fuente
.*
. Solo puedes usarsudo apt-get remove ^k3b
. La presencia de^
es suficiente para hacer que el argumento se interprete como una expresión regular, y cuandoapt
oapt-get
interpreta un argumento como una expresión regular, coincide en cualquier parte del nombre del paquete. Es por eso que necesita^
--a ancla el partido al comienzo del nombre del paquete. La expresión regular no necesita coincidir con el nombre completo del paquete, solo con cualquier parte del mismo.^
, entonces no lo necesites.*
)La expresión regular
*
significa cero o arbitrariamente muchos. Entonces le dijisteapt-get
que eliminara todo lo que contienek3
seguido de cualquier cantidad deb
, básicamente todo lo que contienek3
. Si pruebo su comando en mi sistema, quiere eliminar 58 paquetes.fuente
*
hace el trabajo como un comodín para fiesta al igual que en DOS, pero algunos comandos comoapt-get
esperar que una expresión regular. Cuando escribesudo apt-get remove -s k3b*
, bash primero buscará cualquier archivo en su directorio actual que comience conk3b
. Si encuentra alguno, reemplazará ese argumento con esos nombres de archivo. Si no, pasarák3b*
directamente aapt-get
, lo que lo interpretará como una expresión regular. Si no desea que bash interprete el asterisco como comodín primero (lo que probablemente no quiera), rodee el argumento con comillas simples, como esta:sudo apt-get remove -s 'k3b*'
sudo apt-get remove -s 'k3b.*'
. Me topé con esta respuesta y me pareció muy importante saberlo. En mi humilde opinión, esto es bastante inesperado y lo marcaría como un error de "comportamiento inesperado" de apt-get ... normalmente espera un significado "glob" y no un significado "regexp" si no se especifica. Gracias de todos modos y +1!-s
opción significa "simulación". Le indica queapt-get
no realice la operación, sino simplemente que le informe de lo que sucedería sin la-s
opción.Usar en su
sudo apt-get remove ^k3b
lugar. Cuando instala o elimina paquetes, a*
menudo es peligroso y rara vez se necesita. Si lo usa*
, debe citarlo, pero eso no lo hace más seguro, porque su tendencia a seleccionar muchos más paquetes de los que desea es el resultado de la formaapt
eapt-get
interpretación y no un efecto de la expansión del nombre de ruta .*
menudo son innecesarios .k3b*
eliminan todos los paquetes que contienenk3
cualquier parte de su nombre (y cada paquete que depende de dicho paquete). Eso no es un error tipográfico,k3
es suficiente, incluso sin elb
, porqueb*
significa "cero o másb
s".Cuando se ejecuta
apt
oapt-get
con elinstall
,remove
opurge
acción, cada argumento subsiguiente es primero 1 interpretado como el nombre de un paquete individual. Si existe un paquete con ese nombre exacto, la acción se realiza para él.Si no hay tal paquete,
apt
yapt-get
comprobará si el argumento contiene cualquiera de los comunes de expresiones regulares metacaracteres 2.
,?
,+
,*
,|
,\[
,^
, o$
. Si no, está hecho, no se encontró ningún paquete.Si no contiene ninguno de esos personajes, a continuación, se trata como una expresión regular y compara con cualquier parte de cualquier nombre de paquete. No tiene que coincidir con el nombre completo. Como han dicho otros,
*
en una expresión regular no significa lo mismo que*
en un globo.?
tampoco. En una expresión regular:*
permite que el elemento anterior aparezca cualquier cantidad de veces, incluso una sola vez o ninguna, en lugar de exactamente una vez.?
hace que el elemento anterior sea opcional , es decir, le permite aparecer cero o una vez.apt-get (8) (
man apt-get
) dice:La página de manual sólo menciona
.
,?
y*
, pero es incompleta , ya que+
,|
,[
,^
, y$
también son suficientes para permitirapt-get
oapt
interpretar el patrón como una expresión regular. 3Aunque puede hacer coincidir cualquier número de caracteres con
.*
, no solo,*
solo necesita esto si aparece en el medio de su expresión regular. Debido a que el patrón se compara con cualquier subcadena del nombre de un paquete, no tiene sentido al final (o principio) del patrón.La página de manual menciona
^
y$
. Estos (especialmente^
) son clave para escribir patrones seguros y eficaces para su uso con losinstall
,remove
opurge
acciones enapt
oapt-get
.^
ancla una expresión regular al comienzo de toda la cadena.^k3b
selecciona todos los paquetes cuyos nombres comienzan conk3b
.$
ancla una expresión regular al final de toda la cadena.k3b$
seleccionaría todos los paquetes cuyos nombres terminen enk3b
.Por lo tanto, puede usar este comando para eliminar de forma segura los paquetes:
Finalmente, en el caso específico que mencionó, podría pasar ambos nombres usted mismo:
¡Entonces evitas toda esta complejidad! (Aunque anclar con
^
es simple una vez que está acostumbrado). O use la expansión de llaves , que su caparazón se expande en el comando anterior:1 Hay dos excepciones a esto: (a) se reconocen algunas opciones (p. Ej.
-f
,--purge
) Y (b) algunos caracteres de puntuación que aparecen al final de un argumento que de otro modo se tomarían como un nombre de paquete para realizar la acción. se usa para alterar lo que se hace (por ejemplo,sudo apt install ubuntu-desktop^
instala la tarea en lugar del paquete, y cuando^
aparece al final).2 Existen otros metacaracteres de expresiones regulares. Por ejemplo,
\
es compatible con todos los dialectos de expresiones regulares y de uso común..
,?
,+
,*
,|
,[
,^
, Y$
acaba de pasar a ser los metacaracteres los desarrolladores decidieron APT daría lugar a la interpretación como una expresión regular (después de la resolución como un paquete llamado exacta ha fallado).3 La forma más fácil de verificar esto es simular la instalación o eliminación con dicho patrón, utilizando la
-s
opción como se describe anteriormente. Por ejemplo, ejecutarapt -s install ^virtualbox
programas quesudo apt install ^virtualbox
tendrían el efecto de intentar instalar todos los paquetes que el administrador de paquetes conoce sobre el nombre de quién comienzavirtualbox
. Sin embargo, este comportamiento también se puede verificar examinando el código fuente . Verifique laCacheSetHelper::PackageFromRegEx
función encacheset.cc
.fuente
Es más probable que elimine una lib que tenía k3b de la que dependían esos programas.
En resumen, es posible que nunca sepas. Recomiendo no usar un comodín para eliminar cosas y leer cosas cuando se le solicite (lo siento).
Además, sin las búsquedas de expresiones regulares -n, se usan todos los campos y no solo los nombres
http://ccrma.stanford.edu/planetccrma/man/man8/apt-cache.8.html
También qbi es correcto, su expresión regular es defectuosa desde el primer momento
fuente
apt-get remove
, solo porapt-get cache
. Parece que en realidadapt-get remove
solo busca nombres de paquetes, no descripciones.