apt-get remove com curinga removido muito mais do que o esperado. porque?

33

Ontem à noite eu estava tentando gravar CDs. Ficando aborrecido com o k3b e optando pelo uso do brasero, fui remover o k3b. Eu digitei:

sudo apt-get remove k3b

Eu apertei a tecla duas vezes e vi que eu tinha os dados k3b e k3b no meu sistema. Assumindo que eu não precisaria do k3b-data no meu sistema sem o k3b, eu queria removê-lo também, então eu digitei:

sudo apt-get remove k3b*

Infelizmente, apertei Y para confirmar sem olhar. Desinstalou muito mais que k3b e k3b-data. Ele desinstalou pacotes que não se encaixavam em meu regex "k3b *". Por exemplo: transmissão e gerenciador de rede

Tenho quase certeza de que não tenho um espaço entre o k3b e o *, mas não sei por que mais isso removeria tudo o que ele fazia. Existe algo sobre o apt-get que estou entendendo mal?

    
por Steve Goykovich 02.11.2012 / 15:03

4 respostas

29

O comando que você quer é sudo apt-get remove '^k3b.*' , porque:

  • Você precisa de .* para corresponder a qualquer caractere, qualquer número de vezes
  • Você precisa de ^ para corresponder ao início da string
  • Você precisa citar o regex para evitar que o bash interprete * como curinga

(Esta resposta completa e resume as informações anteriores fornecidas por qbi e Flimm)

    
por Boris 19.08.2014 / 20:36
25

A expressão regular * significa zero ou arbitrariamente muitos. Então você disse a apt-get para remover qualquer coisa que contenha k3 seguido por qualquer número de b , então basicamente tudo o que contém k3 . Se eu tentar o seu comando no meu sistema, ele quer remover 58 pacotes.

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.
    
por qbi 02.11.2012 / 15:13
4

Use sudo apt-get remove ^k3b . Quando você instala ou remove pacotes, * costuma ser perigoso e raramente é necessário. Se você usa * , você deve citá-lo, mas isso não o torna mais seguro, porque sua tendência de selecionar muito mais pacotes do que você pretende é o resultado da maneira como apt e apt-get interpreta e não um efeito da expansão do nome do caminho .

  • Até mesmo os usos seguros de * são muitas vezes desnecessário .
  • Os inseguros usam são brutais . Remover k3b* remove todo pacote que contém k3 em qualquer lugar em seu nome (e todo pacote que depende de tal pacote). Isso não é um erro de digitação - contendo k3 é suficiente, mesmo sem o b , porque b* significa "zero ou mais b s".

Quando você executa apt ou apt-get com a ação install , remove ou purge , cada O argumento subsequente é o primeiro 1 interpretado como o nome de um pacote individual. Se existir um pacote com esse nome exato, a ação será executada para ele.

Se não houver esse pacote, apt e apt-get verificarão se o argumento contém alguma das expressões comuns metacaracteres 2 . , ? , + , * , | , \[ , < href="http://www.regular-expressions.info/anchors.html"> ^ ou $ . Se não, está feito - nenhum pacote foi encontrado.

Se contiver qualquer um desses caracteres, ele será tratado como uma expressão regular e será comparado a qualquer parte de qualquer nome de pacote. Não precisa corresponder ao nome inteiro. Como outros disseram, * em uma expressão regular não significa a mesma coisa que * em uma glob. ? também não. Em uma expressão regular:

  • * permite que o item anterior apareça qualquer número de vezes - incluindo apenas uma vez ou não - em vez de exatamente uma vez.
  • ? torna o item anterior opcional - ou seja, permite que ele apareça zero ou uma vez.

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

  

Se nenhum pacote corresponder à expressão especificada e a expressão contiver   um de '.', '?' ou '*' então é assumido como sendo um POSIX regular   expressão, e é aplicado a todos os nomes de pacotes no banco de dados.   Qualquer correspondência é então instalada (ou removida). Note que a correspondência é   feito por substring, então 'lo. *' combina 'how-lo' e 'lowest'. Se isso é   não desejado, ancorar a expressão regular com um caractere '^' ou '$',   ou crie uma expressão regular mais específica.

A página do manual menciona apenas . , ? e * , mas está incompleta , pois + , | , [ , ^ e $ também são suficientes para permitir que apt-get ou apt interpretem o padrão como uma expressão regular. 3

Embora você possa combinar qualquer número de caracteres com .* - não apenas * - você só precisa disso se aparecer no meio da sua expressão regular. Como o padrão é comparado com qualquer substring de um nome de pacote, é inútil no final (ou no início) do padrão.

O manpage menciona ^ e $ . Esses (especialmente ^ ) são essenciais para criar padrões seguros e eficientes para uso com as ações install , remove ou purge em apt ou apt-get .

  • ^ ancora uma expressão regular no início de toda a cadeia. ^k3b seleciona todos os pacotes cujos nomes iniciam com k3b .
  • $ ancora uma expressão regular no fim de toda a cadeia. k3b$ selecionaria todos os pacotes cujos nomes terminam com k3b .

Portanto, você pode usar este comando para remover os pacotes com segurança:

sudo apt-get remove ^k3b

Por fim, no caso específico que você mencionou, é melhor passar os dois nomes:

sudo apt-get remove k3b k3b-data

Então você evita toda essa complexidade! (Embora a ancoragem com ^ seja simples quando você estiver acostumado.) Ou use expansão da cinta , que seu shell expande no comando acima:

sudo apt-get remove k3b{,-data}
Existem duas exceções: (a) algumas opções ) são reconhecidos, e (b) alguns caracteres de pontuação que aparecem no fim de um argumento que seria usado como um nome de pacote para executar a ação podem ser usados para alterar o que é feito (por exemplo, -f instala a tarefa em vez do pacote e quando --purge aparece no final ).

2 Outros metacaracteres de expressões regulares existem. Por exemplo, sudo apt install ubuntu-desktop^ é suportado por todos os dialetos de expressões regulares e comumente usados. ^ , \ , . , ? , + , * , | e [ são os metacaracteres que os desenvolvedores APT decidiram que acionariam a interpretação como uma expressão regular ( após a resolução, como um pacote exato chamado falhou).

3 A maneira mais fácil de verificar isso é simular a instalação ou a remoção com esse padrão, usando a opção ^ , conforme descrito acima. Por exemplo, executar $ mostra que -s teria o efeito de tentar instalar todos os pacotes que o gerenciador de pacotes conhece, cujo nome começa com apt -s install ^virtualbox . No entanto, esse comportamento também pode ser verificado com o exame do código-fonte . Verifique a função sudo apt install ^virtualbox em virtualbox .

    
por Eliah Kagan 19.09.2017 / 21:53
1

É mais provável que você remova uma biblioteca com o k3b de que esses programas dependiam.

Em suma, você pode nunca saber. Eu recomendo não usar um curinga para remover coisas e ler as coisas quando solicitado (desculpe).

Também sem as pesquisas -n regex use todos os campos e não apenas os nomes

link

também qbi está correto seu regex é falho a partir do get-go

    
por coteyr 02.11.2012 / 15:17