Ignore os pacotes que não estão instalados no momento ao usar "apt-get remove"

15

Eu tenho um cenário em que gostaria de remover um conjunto de pacotes que podem ou não estar instalados, e gostaria do apt-get para remover aqueles que são e ignoram silenciosamente aqueles que não são. Algo como:

apt-get remove foo bar baz

que, se foo e bar fossem instalados, mas o baz não estivesse, removeria o foo e o bar sem reclamar do baz. Existe uma maneira de fazer isso?

As coisas que tentei que não funcionaram, com cups-dbg como meu bode expiatório realmente instalado, a ser removido:

jcp@a-boyd:~$ sudo apt-get remove -y cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

jcp@a-boyd:~$ sudo apt-get remove --ignore-missing cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

jcp@a-boyd:~$ sudo apt-get remove --fix-broken cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

Eu sei que poderia fazer isso com um script de shell e um pouco de dpkg --listmágica, mas gostaria de evitar qualquer complexidade que não seja absolutamente necessária.

javawizard
fonte
Esta resposta funcionou para mim no final. Correção idiota para um problema idiota. Observe que, na verdade, existe um defeito no Launchpad sobre isso , fique à vontade para contribuir.
Jeff

Respostas:

8

Voltar para a ferramenta de nível inferior, como o dpkg, é uma opção?

dpkg --remove foo bar libperl-dev
dpkg: warning: ignoring request to remove foo which isn't installed
dpkg: warning: ignoring request to remove bar which isn't installed
(Reading database ... 169132 files and directories currently installed.)
Removing libperl-dev ...

Para remover os arquivos de configuração de pacotes, use a limpeza como abaixo

dpkg --purge foo bar libperl-dev
barti_ddu
fonte
1
Eu deveria ter mencionado que os pacotes a serem removidos podem ter dependências reversas e gostaria que eles fossem removidos também. Portanto, o apt-get é muito melhor que o dpkg, mas aceitarei sua resposta, pois parece que não há realmente uma maneira melhor de fazer isso.
Javawizard
7

Eu uso apt-get remove --purge(aka apt-get purge) para a dependência a seguir com uma lista de pacotes. Para lidar com pacotes que não existem, filtre pacotes que não estão instalados com o seguinte script.

pkgToRemoveListFull="cups-dbg bogus-package"
pkgToRemoveList=""
for pkgToRemove in $(echo $pkgToRemoveListFull); do
  $(dpkg --status $pkgToRemove &> /dev/null)
  if [[ $? -eq 0 ]]; then
    pkgToRemoveList="$pkgToRemoveList $pkgToRemove"
  fi
done
apt-get --yes --purge remove $pkgToRemoveList
Lucas
fonte
3

Para o Debian ≤ 9, é possível usar apenas ao aptitudeinvés de apt-get:

sudo aptitude remove -y cups-dbg bogus-package

O Aptitude imprime avisos, mas continua a remover seus pacotes:

Couldn't find any package whose name or description matched "bogus-package"
...
Removing cups-dbg ...
...

Se você deseja limpar (excluir arquivos de configuração do pacote) em vez de remover (manter os arquivos de configuração), observe que aptitudeapenas limpa os pacotes fornecidos diretamente, enquanto as dependências não utilizadas são removidas apenas. No entanto, você pode limpar todos os pacotes removidos em uma segunda etapa:

apt-get -y purge $(dpkg -l | grep ^rc | awk '{print $2}')
vog
fonte
Está bem. às vezes, o bogus-packagejusto tinha o nome errado. então, caso tivéssemos 500 pacotes, seria melhor analisar também os pacotes falsos e fazer alguns truques (por exemplo, números após o nome da falta etc.). ..
nyxee 15/08
@nyxee, proponho fazer isso como uma nova pergunta, apontando exatamente o que você deseja alcançar.
vog
1
Esta seria uma boa solução, exceto que 1) o aptitude não está mais instalado por padrão no Ubuntu 18.04 e 2) o aptitude possui uma maneira bem diferente (pode-se dizer estranha) de lidar com curingas.
Jeff
Isto não está funcionando para mim no Debian 10. EntendoCouldn't find any package whose name or description matched 'QUX' Unable to apply some actions, aborting
pdoherty926
@ pdoherty926 Obrigado pela dica. Eu verifiquei isso e ajustei minha resposta de acordo.
vog
0

Outro pequeno liner de 2 linhas, se alguém precisar usar o apt:

purge_packages () {
  matchedPackages="$(echo "$(apt list --installed $* 2>/dev/null)" | grep -v '^Listing\.\.\.' | sed -s 's|[/ ].*||' | tr '\n' ' ' | sed 's/ *$//;s/^ *//')"
  [[ -n "$matchedPackages" ]] && apt purge -yq $matchedPackages
}

Explicação:

apt list --installed $*         # Lists packages matched from function args, the --installed flag limits results to installed packages

2>/dev/null                     # Disregard the warning about using this command in a script

grep -v '^Listing\.\.\.'        # Remove the first line of output that says "Listing..." or "Listing... Done"

sed -s 's|[/ ].*||'             # Remove the rest of the line after the package name (I'm checking for / or space though it looks like just the slash is needed but package names will never have a space)

tr '\n' ' '                     # Put it all on one line separated by spaces

sed 's/ *$//;s/^ *//'           # Remove trailing and leading spaces from the line so it will be blank during the test next line if nothing was matched

[[ -n "$matchedPackages" ]]     # Check if any packages were matched

apt purge -yq $matchedPackages  # Purge them!
Meir
fonte
Bem-vindo ao SuperUser! Você adicionaria mais descrição à sua resposta sobre o que seu script faz e como ele faz?
El8dN8
@ El8dN8 Adicionado explination
Meir