Você poderia tentar algo como:
list="" ; for pkg in $(apt-cache search ^mate | grep -v -- '-dev'); list="$list $pkg" ; done ; sudo apt-get install $list
Eu quero instalar todos os pacotes MATE,
$ sudo apt-get install '^mate'
No entanto, ele seleciona muitos pacotes e alguns pacotes estão em conflito com alguns pacotes instalados.
Agora, quero excluí-los. Alguma idéia?
Nenhuma surpresa, isso não funcionará:
$ sudo apt-get install '^mate && !-dev'
Ou, posso simplesmente deixar o apt-get ignorar esses pacotes conflitantes?
Você só pode passar uma expressão regular como argumento para apt-get install
.
Você pode fazer uma expressão regular que faça o que quiser, mas é tediosa. A negação de uma expressão regular pode ser expressa com uma expressão regular, mas o tamanho da regex do complemento cresce exponencialmente com o tamanho do original em geral.
apt-get install '^mate(.?.?.?|.*([^v]|[^e]v|[^d]ev|[^-]dev))$'
Você pode usar os padrões de pesquisa do Aptitude para gerar a lista de pacotes com uma sintaxe semi-decente e passar a lista resultante para apt-get install
ou aptitude install
.
aptitude search '^mate !-dev$'
Eu também fiz a pergunta. Eu tentei lookaheads negativos, mas o apt-get não os entendia. Então eu procurei por outro caminho, arquivar o mesmo resultado e encontrei a resposta aqui. No entanto, como a solução escolhida usa o grep, você pode usar lookaheads e encurtar a expressão do serach, em termos de chamadas, ainda mais:
apt-cache search '^mate' | grep -P '^mate(?!.*dbg)(?!.*dev).*'
E lembre-se de que os pacotes Mates, como atril, não começam com um parceiro no início de seu nome. Eles nem sequer contêm isso.