Acabei de encontrar o seguinte comando que funcionou:
sudo apt-get purge $(dpkg -l | grep '^rc' | awk '{print }')
Eu tenho uma lista de pacotes no meu sistema, que foram instalados e removidos novamente, mas não eliminados, ou seja, ainda há muitos conffiles etc. em volta.
A saída de dpkg --get-selections | grep deinstall
lista cerca de 85 pacotes diferentes que eu não preciso e não quero ser totalmente eliminados.
Então, minha pequena pergunta, que eu decidi finalmente perguntar depois de experimentar, levou a problema , é:
Como completamente elimino pacotes previamente instalados que já foram removidos?
Reinstalar e limpar não é uma opção, é claro.
Acabei de encontrar o seguinte comando que funcionou:
sudo apt-get purge $(dpkg -l | grep '^rc' | awk '{print }')
dpkg --get-selections | grep deinstall
produz uma lista de nomes de pacotes com a palavra " deinstall
":
$ dpkg --get-selections | grep deinstall
account-plugin-windows-live deinstall
debarchiver deinstall
flashplugin-installer deinstall
...
Solicitando que awk
imprima apenas o primeiro campo:
$ dpkg --get-selections | awk ' == "deinstall" {print }'
account-plugin-windows-live
debarchiver
flashplugin-installer
...
Agora que temos a lista de pacotes, xargs
nos permitirá alimentar a lista de pacotes para um comando (ou comandos, se a lista for longa o suficiente):
dpkg --get-selections | awk ' == "deinstall" {print }' | xargs sudo apt-get purge --dry-run
Quando estiver satisfeito com os resultados simulados, remova --dry-run
do comando apt-get
.
Leia:
for i in awk xargs apt-get ; do
man $i
done
Eu mesmo perguntei isso há alguns dias. Caiu com
apt-get purge $(dpkg -l | awk 'BEGIN{ORS=" "} /^rc/{ print }')
Os pacotes removidos, mas não eliminados, aparecem na saída de dpkg -l
com rc
no início. awk
seleciona a segunda coluna, também conhecida como o nome do pacote, e as imprime separadas por espaço.
Se você quiser apenas limpar toda a lista, você pode usar este comando; ele executará uma execução seca, no caso de pacotes essenciais serem removidos, o que você provavelmente não quer que aconteça:
dpkg --get-selections | sed -n 's/\tdeinstall$//p' | xargs sudo apt-get --dry-run purge
Se nenhum pacote essencial for removido, é seguro executar o comando real:
dpkg --get-selections | sed -n 's/\tdeinstall$//p' | xargs sudo apt-get --yes purge
sed -n 's/\tdeinstall$//p'
: imprime apenas linhas em stdin
, em que uma tabulação seguida por uma string deinstall
pode ser removida do final da linha; isso tem o efeito de imprimir somente as linhas contendo uma tabulação seguidas por uma string deinstall
no final da linha sem a tabulação real seguida pela string deinstall
no final da linha xargs sudo apt-get --yes purge
: passa cada linha em stdin
como um argumento para sudo apt-get --yes purge
Meus cinquenta centavos, um simples oneliner:
Primeiro teste com
dpkg --get-selections | awk '=="deinstall" {system("sudo apt-get --dry-run purge ")}'
e tchau tchau
dpkg --get-selections | awk '=="deinstall" {system("sudo apt-get -y purge ")}'
Exemplo
% dpkg --get-selections | grep deinstall
nginx-common deinstall
% dpkg --get-selections | awk '=="deinstall" {system("sudo apt-get -y purge ")}'
% dpkg --get-selections | grep deinstall
[no output]