Qual é a maneira correta de remover completamente um aplicativo?

546

Eu procurei na net por essas informações e encontrei diferentes linhas de comando, como estas:

sudo apt-get remove application
sudo apt-get remove application*

sudo apt-get remove --purge application
sudo apt-get remove --purge application*

sudo apt-get purge application
sudo apt-get purge application*

Então, qual é o caminho correto? É necessário usar esse "*"?

Depois disso, eu também encontrei estes comandos:

sudo updatedb
sudo locate application
sudo rm -rf (file/folder name)
user48949
fonte
1
Algumas de suas perguntas podem ser respondidas neste post: askubuntu.com/questions/1143/how-can-i-uninstall-software
Glutanimate
8
application*pode ocasionalmente fornecer resultados inesperados - por exemplo, se você tiver um arquivo no diretório atual chamado application_information, o shell o expandirá antes de ser passado para o apt-get. Se isso está acontecendo e você quer o asterisco literal, você pode usar application\*ou'application*'
Izkata
6
application*é ainda mais perigoso quando não há arquivos no diretório atual: apt-getusa expressões regulares, sem padrões globais. As pessoas quase apagaram todo o sistema tentando remover wine*.
Andrea Corbellini 23/11
3
Você pode aceitar uma resposta? Agradecer às pessoas que responderam a você.
M-ric
Nem application*nem application\*é seguro! A citação *com \ou ' 'apenas aumenta o risco, assegurando que *seja passado como está apt-get(embora geralmente seja assim mesmo!), Faz apt-getcom que o argumento seja interpretado como um regex. Em uma regex *significa "zero ou mais do caractere anterior". Uma forma comum do erro é desinstalar wine*, removendo todos os pacotes com win(não wine, win) em qualquer lugar em seus nomes e todos os pacotes dependendo de nenhum deles. Veja esta explicação e possíveis correções . @Izkata
Eliah Kagan

Respostas:

705
  • apt-get remove packagename

    removerá os binários, mas não os arquivos de configuração ou dados do pacote packagename. Ele também deixará as dependências instaladas no momento da instalação intocadas.

  • apt-get purge packagename ou apt-get remove --purge packagename

    removerá quase tudo sobre o pacote packagename, mas não as dependências instaladas com ele na instalação. Ambos os comandos são equivalentes.

    Particularmente útil quando você deseja "começar tudo de novo" com um aplicativo, porque você estragou a configuração. No entanto, ele não remove os arquivos de configuração ou de dados que residem nos diretórios pessoais dos usuários, geralmente nas pastas ocultas. Não há uma maneira fácil de remover esses também.

  • apt-get autoremove

    remove pacotes órfãos, ou seja, pacotes instalados que costumavam ser instalados como uma dependência, mas não são mais. Use isso após remover um pacote que tinha dependências instaladas nas quais você não está mais interessado.

  • aptitude remove packagenameou aptitude purge packagename(da mesma forma)

    também tentará remover outros pacotes exigidos pelo packagenameon, mas que não são exigidos pelos pacotes restantes. Observe que aptitudesomente as informações de dependência são lembradas para os pacotes que foram instalados.

E muitos mais existem. dpkgComandos de nível inferior podem ser usados ​​(avançado) ou ferramentas de GUI como Muon, Synaptic, Software Center, etc. Não existe uma 'maneira correta' de remover aplicativos ou executar outras tarefas que interagem com o gerenciamento de pacotes.

A lista que você encontrou são apenas exemplos. Certifique-se de entender os significados e tente o que ele quer fazer antes de aceitar a ação (é necessário pressionar Yantes que ele efetue as ações conforme proposto).

A versão do asterisco na pergunta provavelmente está errada ; apt-getaceita uma expressão regular e não um padrão glob como o shell. Então, o que acontece com

sudo apt-get remove application*

é o seguinte:

  1. O shell tenta expandir application*olhando os arquivos no diretório atual. Se (como normalmente é o caso) não encontrar nada, ele retornará o padrão glob inalterado (supondo que basho comportamento padrão seja aqui --- zshocorrerá um erro).

  2. apt-getirá remover os pacotes cujo nome contém uma seqüência que satisfaz a expressão regular application*, ou seja, applicatioseguido de um número arbitrário de n: applicatio, application, applicationn, libapplicatio, etc.

  3. Para ver como isso pode ser perigoso, tente (sem raiz para segurança dupla) apt-get -s remove "wine*"( -ssimulará a coisa em vez de fazê-la) --- ele dirá que removerá todos os pacotes que possuem "vitória" em seu nome e dependentes, quase todo o sistema ...

Provavelmente, o comando que foi feito é realmente

 sudo apt-get remove "^application.*"

(observe as aspas e o ponto) que removerão todos os pacotes cujo nome começa com application.

Esses comandos,

sudo updatedb                  # <-- updates the locate database (index). harmless
sudo locate application        # <-- locates the file 'application'. harmless
sudo rm -rf (file/folder name) # <-- removes files/dirs recursively. dangerous.

estão completamente fora do escopo do gerenciamento de pacotes. Não remova arquivos pertencentes a pacotes sem usar o gerenciador de pacotes! Vai ficar confuso e é a maneira errada de fazer as coisas.

Se você não souber a qual pacote um arquivo pertence, tente o seguinte:

dpkg -S /path/to/file
gertvdijk
fonte
9
A opção --purge também é útil ao tentar remover completamente todas as dependências restantes, incluindo seus arquivos de configuração: apt-get-autoremove --purge também é importante observar que os arquivos de configuração no diretório inicial não são afetados pela opção --purge. Estes você terá que remover manualmente.
Glutanimate
1
Houve um erro aqui: apt-get aceita RE, não globs; então o apt-get remove pack * removerá todos os pacotes que começam com pac seguidos por zero ou mais k ... o que normalmente é inesperado. Eu editei o anser. Veja também askubuntu.com/questions/210976/…
Rmano
Eu acho que essa resposta não é mais precisa. Uma apt remove -s texlive*ou suas apt-getcontrapartes retornam linhas como Note, selecting 'texlive-font-utils' for glob 'texlive*'(implicando que elas realmente aceitam globs), seguidas pelas linhas usuais Package 'texlive-common' is not installed, so not removede, finalmente Remv, como Remv texlive-font-utils [2015.20160320-1] [...].
Jonathan Y.
@JonathanY. Você também selecionaria pacotes não instalados. De qualquer forma, você poderia fazer uma NOVA pergunta e elaborar um pouco mais detalhadamente qual é a sua situação. Eu ficaria feliz de olhar para ele :)
gertvdijk
Não estou fazendo uma nova pergunta. Estou apontando para uma possível alteração, já que essa resposta foi feita, tornando alguns dos detalhes incorretos. A saber, parece que apt-get remove packa*, de fato, pega a glob em packa*vez de encará-la como regex: ela combina, packagemas não pack.
Jonathan Y.
110

Para o Ubuntu 12.04 e talvez superior, o método correto é:

sudo apt-get --purge autoremove packagename

Conforme detalhado aqui .

Não use, packagename*pois isso pode excluir pacotes indesejados e causar mais problemas do que resolve. Ou se você deve, pelo menos executá-lo com um -s, --simulate, --dry-runflag primeiro a ver exatamente o que ele vai fazer sem fazê-lo.

Kurtosis
fonte
13
esta é a resposta correta, curto e conciso:
Anwar
20

Você pode usar este comando:

sudo apt-get purge --auto-remove packagename

Ele limpará os pacotes necessários junto com as dependências instaladas com esses pacotes. A --auto-removeopção (sendo um alias de autoremove) funciona de maneira semelhante a sudo apt-get autoremove. Usando este comando, podemos executar um único comando:

sudo apt-get purge --auto-remove packagename

Ao invés de:

sudo apt-get purge packagename
sudo apt-get autoremove
pl_rock
fonte
2
Embora você esteja correto, mas também é possível usar sudo apt-get --purge autoremove packagename. Mesmo comando 1 aqui
Anwar
O comando completo também pode ser escrito como em apt-get autoremove --purgevez de apt-get purge --auto-remove?
Feltro #
3
Alguém pode me matar por favor?
Martin Andersson
7

Você pode usar com segurança sudo apt-get remove --purge applicationou sudo apt-get remove applications99% do tempo. Quando você usa o purgesinalizador, ele também remove todos os arquivos de configuração. O que pode ou não ser o que você deseja, dependendo se você deseja reinstalar o referido aplicativo. Ele application*corresponderá a todos os aplicativos iniciados application, geralmente plugins, recursos adicionais, etc. do aplicativo principal que você está removendo. ie

sudo apt-get remove gedit*

removeria gedit, gedit-pluginse gedit-common. Normalmente, não é necessário fazer isso, porque a maioria dos plugins / programas associados depende do aplicativo principal e será automaticamente removida (ou marcada para remoção) quando você desinstalar o aplicativo principal.

Seu último comando é apenas remover as sobras de aplicativos que possuem desinstaladores confusos e apenas remover os restos do aplicativo.

reverendj1
fonte
5

Recebi algumas mensagens de erro ao remover um pacote, a única maneira que achei que funcionou foi esta:

mv /var/lib/dpkg/info/package.* /tmp/
dpkg --remove --force-remove-reinstreq package

Eu descobri que embora usando apenas

dpkg --remove --force-remove-reinstreq package

não remove o pacote, mostra o caminho correto para o arquivo para mover:

mv /var/lib/dpkg/info/package.* /tmp/

Substitua o pacote pelo nome do seu aplicativo. Use sudo no Ubuntu, torne-se root no Debian.

DangerFireBob
fonte
1

Depende do aplicativo que você deseja remover. Sempre verifique suas dependências antes de emitir o comando yes. Quando você remove algo por linha de comando, ele às vezes mostra algumas bibliotecas que não são mais necessárias. Eles podem ser removidos com o apt-get autoremove.

Cuidado ao usar comandos como sudo apt-get remove --purge applicationname, pode remover algumas dependências necessárias a outros aplicativos e, como tal, pode danificar seu sistema.

Se você quiser fazê-lo da maneira mais segura, sempre poderá removê-lo usando apenas o centro de software ou o apt-get remove applicationname. Se as dependências não forem mais necessárias, emita o apt-get autoremove mais tarde.

gustavokrm
fonte
Eu acho que todo o sistema de pacotes Debian foi projetado especificamente para não remover um pacote se houver outros pacotes dependentes dele. Você pode ser (amavelmente) perguntado se você deseja remover todos os pacotes dependentes também, e é aí que você deve realmente ler a lista de pacote prestes a ser removido, o que é que eu acho que o que você está tentando dizer.
Xen2050
1

Eu só queria esclarecer uma coisa que parece ser uma fonte de confusão aqui. O dpkgutilitário não conhece ou rastreia dependências de pacotes em relação um ao outro, o que foi um grande motivo que aptfoi desenvolvido, acredito. Você pode ler sobre isso na seção 8.6 desta página. Perguntas freqüentes sobre o Debian GNU / Linux - As ferramentas de gerenciamento de pacotes Debian

  • Com o apt: se eu quisesse limpar o pacote A e ele tiver uma dependência chamada pacote B, e o pacote B não tiver outros pacotes dependentes, os pacotes A e B serão eliminados. Se o pacote B tiver outros pacotes dependentes, apenas o pacote A será eliminado.

  • Com dpkg: que dependência? Você acabou de me dizer para limpar o maldito
    pacote, e foi isso que eu fiz! Um mau planejamento da sua parte não
    constitui uma emergência da minha parte.

Com isso dito, aqui estão duas linhas que podem ser usadas para cada método de purga:

dpkg --list |grep "^rc" | cut -d " " -f 3 | xargs sudo dpkg --dry-run --purge

apt-get autoremove -y; apt-get --dry-run purge -y $(dpkg --list |grep '^rc' |awk '{print $2}')

Remova o --dry-runpara executar a operação de limpeza real em vez de relatar quais ações ela teria tomado.

Sysinfo.io
fonte