Como selecionar um intervalo incompleto de pacotes com o apt?

3

Existe uma maneira simples de selecionar um intervalo de pacotes (especialmente pacotes relacionados ao kernel) para instalação ou remoção com o apt (ou outra ferramenta)?

Atualmente, estou tentando remover um intervalo de kernels antigos com apt remove linux-\*-4.4.0-{40..80}-\* .

Isso seleciona corretamente os pacotes que eu quero remover, mas o processo é imediatamente interrompido por erros no formulário E: Couldn't find any package by glob 'linux-*-4.4.0-65-*' .

Na verdade, não há nenhum pacote correspondente a este regexp, mas estou muito surpreso pelo fato de que isso leva a um erro em vez de um aviso. Afinal, remover um conjunto vazio de pacotes é trivial!

    
por ysalmon 01.08.2017 / 12:00

3 respostas

1

Isso pode ser feito usando a substituição de comandos . Por exemplo:

apt-get remove $(dpkg -l 'linux-*' | awk '/-4.4.0-([4-7][0-9]|80)-/ { print $2}')

Ou com dlocate se você tiver instalado:

apt-get remove $(dlocate -k | grep -E -- '-4.4.0-([4-7][0-9]|80)-') 

Ao contrário de qualquer solução envolvendo xargs , a substituição de comando não altera o descritor de arquivo stdin de apt-get , assim o apt-get pode receber entrada normalmente (por exemplo, respostas a perguntas debconf). xargs obtém sua própria entrada de stdin, portanto, não deve ser usado com programas interativos, ou seja, programas que podem querer entrada de stdin.

Para usar apt-get com xargs , primeiro você precisa se certificar de que não fará perguntas, por exemplo:

export DEBIAN_FRONTEND=noninteractive
dlocate -k | grep -- -4.4.0- | xargs apt-get remove -y

Observação sobre dlocate : A opção -k lista todos os pacotes relacionados ao kernel e ao dkms instalados, um por linha (e -K faz o mesmo, mas no formato dpkg -L detalhado). Eu adicionei a opção -k a dlocate para ativar exatamente esse tipo de uso, mas até agora nunca me ocorreu que deveria haver um argumento regexp opcional após o -k , mesmo que isso seja completamente óbvio - eu sempre usei apenas com grep .

A próxima versão de dlocate (ou seja, > = 1,08) suportará dlocate -k '-4.4.0-' sem necessidade de enviar a saída através de grep .

    
por 02.08.2017 / 04:24
1

Algo como apt list linux-\*-4.4.0-{40..80}-\*|awk -F '/' '{print $1}' |xargs apt remove deve funcionar, eu acho.

    
por 01.08.2017 / 12:36
0

obtenha a lista de pacotes instalados ( linux-image ):

dpkg --list | grep  linux-image | awk '{print $2}' > file

Classifique / edite seu file , mantenha apenas o linux-image a ser removido e execute:

file=$(cat file)
echo "$file"
apt remove $file
    
por 01.08.2017 / 20:29