É possível desfazer um comando apt-get install?

67

Eu instalei o Carpadio na minha instalação do Xubuntu (um Live USB), que então extraiu mais de 50 pacotes, suponho, do lado Ubuntu do repositório. Agora eu gostaria de desfazer isso. No entanto, para toda a minha busca, não consigo encontrar nada mais útil do que Como posso reverter o comando sudo apt get install , o que apenas sugere apt-get purge. Isso não é útil, pois tudo o que faz é remover 2 pacotes (carpadio e carpadio-gnomepanel).

/var/log/apt/history.logpossui uma lista de todos os pacotes que foram instalados junto com esse comando. Então, eu queria saber se existe alguma maneira fácil de remover todos eles ? Caso contrário, eu posso apenas reinstalar, essa foi uma nova instalação de qualquer maneira, mas estou curioso.

Uma pequena amostra do log do histórico (1/5-1 / 10 da lista inteira)

Linha de comando: apt-get install cardapio-gnomepanel
Instale: libdbusmenu-qt2: amd64 (0.9.2-0ubuntu1, automático), python-packagekit: amd64 (0.7.2-4ubuntu3, automático), cups-pk-helper: amd64 (0.2.1.2-1ubuntu0.1, automático) , geoclue: amd64 (0.12.0-1ubuntu12, automático), unidade: amd64 (5.18.0-0ubuntu1, automático), impressoras indicadoras: amd64 (0.1.6-0ubuntu1, automatic), libevolution: amd64 (3.2.3- 0ubuntu6, automático), libqt4-declarative: amd64 (4.8.1-0ubuntu4.3, automatic), libmtp9: amd64 (1.1.3-1ubuntu0.1, automático), tracker-miner-fs: amd64 (0.14.0-2ubuntu1 , automático), gir1.2-rb-3.0: amd64 (2.96-0ubuntu4.2, automático), python-aptdaemon.pkcompat: amd64 (0.43 + bzr805-0ubuntu7, automático), gnome-media: amd64 (3.4.0- 0ubuntu3.1, automático), metacity: amd64 (2.34.1-1ubuntu11, automático), nautilus: amd64 (3.4.2-0ubuntu6, automático), libcompizconfig0: amd64 (0.9.7.0 ~ bzr428-0ubuntu6, automático), compiz- plugins-default:amd64 (0.9.7.12-0ubuntu1, automático), libunistring0: amd64 (0.9.3-5, automático), libebackend-1.2-1: amd64 (3.2.3-0ubuntu7, automático), ubuntu-docs: amd64 (12.04.6 , automático), python-mako: amd64 (0.5.0-1, automático),

Para todos os que sugeriram autoremove: Não sei por que, mas recebi apenas 1 outro pacote relacionado ao python (python-keybinder ou algo assim) como "desnecessário" e isso é tudo o que o autoremove conseguiu remover.

Entre a instalação e desinstalação, apenas as principais mudanças foram instaladas xubuntu-restricted-extras.

Karthik T
fonte
4
É um pouco tarde para ajudar neste caso, mas da próxima vez que você quiser instalar algo, considere fazer uma simulação primeiro. Executar sudo apt-get install -s packageonde -sdenota uma simulação e packageserá substituído pelo nome do software apropriado.
@ vasa1 Sim, estou me superando sobre isso. apt-get pede [Y / n], bem como, que deveria ter sido a minha fora ..
Karthik T
Eu tenho apenas mais um outro pacote relacionado ao python (python-keybinder ou summat) como "desnecessário". Você realmente removeu o cardapio-gnomepanelpacote?
precisa saber é o seguinte
@gertvdijk sim, apt-get remove carpadiolevou esse também.
precisa
11
@KarthikT Então, eu estou completamente perdido por que autoremovenão está funcionando para você. De alguma forma, você marcou todos os pacotes como instalados manualmente agora ou há um mal-entendido. É muito simples: apt-get autoremoveapenas remove todos os pacotes marcados instalados automaticamente sem uma razão para tê-los agora. Se isso não funcionar para você, acho que você mudou algo no sistema que não contou na sua pergunta.
precisa saber é

Respostas:

79

Basicamente, você terá que apt-get remove(ou o apt-get purge) o pacote e executar apt-get autoremovedepois disso, para reverter a instalação do package-one.

Vamos olhar para todo o processo:

  • sudo apt-get install package-one instala 50 dependências marcadas como "automáticas", como também pode ser visto no trecho de log da sua pergunta

  • sudo apt-get purge package-one Remove (expurgos) apenas um, mas fazer executar este!

    Todas as ações de instalação a seguir (se você executar alguma) produzirão uma mensagem informativa com os pacotes não mais necessários:

    The following packages were automatically installed and are no longer required:
      package-two package-three [...]
    Use 'apt-get autoremove' to remove them.
    

    Esta lista é basicamente apenas uma lista de todos os pacotes marcados como "automáticos" sem uma dependência reversa deles. Em outras palavras, não há razão para eles serem instalados no que diz respeito ao gerenciamento de pacotes.

    Nota: Nenhuma instalação é necessária! É apenas para demonstrar que o APT é inteligente para falar sobre seus pacotes desnecessários!

  • sudo apt-get autoremove --purge remove (limpa) esses

Mais Informações

gertvdijk
fonte
2
Neste OP atraiu o Unity e todos os seus amigos. Duvido que a remoção do cardapio remova o Unity etc., mesmo após a remoção automática.
@ vasa1 Por quê? Os pacotes estão marcados como 'instalados automaticamente' (como pode ser visto na pergunta) e, se não for encontrado nenhum motivo para instalação desses sistemas no sistema, eles serão sugeridos para remoção autoremove.
precisa saber é
Sim, eu queria saber sobre o "automático". Se isso serve para indicar a remoção automática, isso é bom. OP não deve ter problemas então.
@gertvdijk boa captura por @ vasa1, pls ver minha edição. autoremovenão ajudou.
precisa
@gertvdijk, para "Ações de instalação subsequentes", seria sudo apt-get updatesuficiente?
19

Quando você deseja remover um pacote e suas dependências instaladas no momento, você deve usar:

sudo apt-get purge package
sudo apt-get --purge autoremove

mas para desfazer aptações, você pode usar o apt-undoscript. É um script simples que pode desfazer as aptações executadas no Ubuntu. Deve-se notar que esse script só pode funcionar se você o usar, em vez de apt-getinstalar / atualizar / remover / remover / limpar / fazer o downgrade de seus pacotes.

Para instalar apt-undono Ubuntu, execute os seguintes comandos no terminal:

sudo add-apt-repository ppa:lkjoel/apt-undo
sudo apt-get update
sudo apt-get install apt-undo

uso:

apt-undo install yourpackages
apt-undo remove yourpackages
apt-undo purge yourpackages
apt-undo upgrade
apt-undo dist-upgrade
apt-undo install yourpackages=old.version
apt-undo install yourpackages=new.version

Para desfazer, as aptitudeações acima executam os seguintes comandos no terminal:

apt-undo undo
Ramin
fonte
11
Obrigado, me deparei com este, e parecia exatamente o que o médico ordenou, até que eu vi a ressalva de que eu precisava para usá-lo para instalar, para ser capaz de desfazer ..
Karthik T
11
Boa pegada. Sintaxe muito confusa, no entanto. E realmente não gosto de usar alternativas ao aplicativo APT principal bem testado. Ainda +1!
precisa saber é
7

Use o poder do Unix. Pegue a linha do arquivo de log que você possui e construa um comando que desfará o que o apt fez. Por exemplo:

$ echo 'Install: libdbusmenu-qt2:amd64 (0.9.2-0ubuntu1, automatic), python-packagekit:amd64 (0.7.2-4ubuntu3, automatic), cups-pk-helper:amd64 (0.2.1.2-1ubuntu0.1, automatic),'|perl -pe 's/ \(.*?\)//g; s/,//g; s/^Install: //'
libdbusmenu-qt2:amd64 python-packagekit:amd64 cups-pk-helper:amd64

Portanto, você pode usar essa eliminação de todos os pacotes que você instalou acidentalmente, dada a linha apropriada do seu arquivo de log:

$ dpkg -P $(echo '(full log line here)' | perl -pe 's/ \(.*?\)//g; s/,//g; s/^Install: //')

(Eu usei, em perlvez de, sedporque sedusa um tipo de expressão regular que não suporta correspondências não gananciosas, que era a maneira mais fácil de construir o que eu precisava)

Robie Basak
fonte
11
Bom roteiro, mas deve ser realmente apenas uma sequência de comandos que as pessoas lembram de realizá-lo.
precisa saber é
Obrigado, script intimidante, mas eu tinha medo que tudo se resumisse a isso #
Karthik T
11
Usei código muito semelhante para resolver meu problema muito semelhante . Fiz isso em várias etapas apenas para ter mais certeza do que estava acontecendo. Primeiro, copiei o bloco de texto relevante do aptlog para um novo arquivo e apliquei o seguinte: perl -pe 's/\(.*?\)(, )?//g' /path/to/apt-history.log então tudo o que fiz foi anexar essa saída sudo apt-get removee já estava pronto!
Insperatus
1

Depois de remover o pacote único, e você pode removê-lo completamente adicionando --purge, for, apt-get remove --purge <package>ele deve lhe dar uma mensagem de que os pacotes da biblioteca extraídos foram instalados automaticamente e não são mais necessários; nesse momento, você pode executar apt-get autoremovepara Remova eles.

Ken Kinder
fonte
Obrigado, mas a remoção automática provou ser insuficiente neste caso. Por favor, veja minha edição.
precisa saber é o seguinte
1

Siga o sudo apt-get purge packagenamecom

sudo apt-get autoremove. 

A menos que seja um metapacote, isso deve cuidar disso.

Consulte também as perguntas frequentes em Como removo manualmente todos os arquivos do Cardapio? .

perseguições
fonte
Obrigado, mas a remoção automática provou ser insuficiente neste caso. Por favor, veja minha edição. Obrigado pelo link do FAQ, muito útil!
precisa
11
Alguns desses pacotes podem ser necessários por outras coisas e não marcados como capazes de serem removidos automaticamente. Você olhou as instruções no link? Como estão esses?
usar o seguinte comando
As instruções no link são ortogonais ao problema principal e, como está, estou inclinado a reinstalar o sistema. obrigado de qualquer maneira.
precisa
1
  1. Cole a longa lista de pacotes indesejados do log do apt em um diretório new_file.txt
  2. Executar perl -pe 's/\(.*?\)(, )?//g' /path/to/new_file.txt
  3. Copie a saída do último comando para a área de transferência ou envie-a para lá em primeiro lugar .
  4. Execute sudo apt-get remove[cole o conteúdo da área de transferência aqui]

Feito.

Basicamente, precisamos formatar a lista de pacotes do log do apt para algo que o apt-get possa entender. Os parênteses, as palavras entre as vírgulas e as vírgulas precisam ir, então é aí que o perl entra para jogar. Sim, existem maneiras melhores (mais eficientes) - mas eu fiz isso, é fácil de entender e funciona.

Insperatus
fonte
+1 para experiência e explicação pessoal, mas como mencionei anteriormente, eu já redefini meu Live USB
Karthik T
1

Para desfazer a última instalação do apt, você também pode usar algo como isto:

sudo apt purge $(grep "Install:" /var/log/apt/history.log | tail -n 1 | tr " " "\n" | grep ":amd64\|:i386" | tr "\n" " ")

Isso irá capturar a última instalação apt do histórico e limpar todos os pacotes aqui instalados.

Você pode criar uma função chamada aptpurgelastinstall para tê-la sempre à mão (adicionará o código a ~ / .bashrc):

echo 'aptpurgelastinstall () { sudo apt purge $(grep "Install:" /var/log/apt/history.log | tail -n 1 | tr " " "\n" | grep ":amd64\|:i386" | tr "\n" " ") ; }' >> .bashrc

Agora você só precisa digitar aptpurgelastinstall no shell para refazer a última instalação.

user981297
fonte
Reagindo ao comentário da edição sugerida : "Melhor minha própria postagem (antes de me registrar)." Você pode solicitar a fusão de suas contas, consulte askubuntu.com/help/merging-accounts .
Melebius 18/09
0

Se você acabou de adicionar um ppa e deseja reverter, execute as etapas descritas abaixo. Entenda que isso pode falhar, quando você instala outros pacotes e não deseja desinstalar. Tenho certeza que isso pode ser feito com um script. Pessoalmente, acho que isso deve fazer parte do apt, e deve haver uma melhor administração de quais pacotes estão instalados por causa de dependências e quais são instalados por solicitação do usuário.

1) remova o ppa de /etc/apt/sources.list Lembre-se da hora em que você adicionou o ppa. Se você tiver sorte, não precisa ser preciso.

2) faça uma lista do que reinstalar, a partir do momento em que você instalou o PPA: cat /var/log/dpkg.log | grep 'upgrade'

3) faça uma lista do que remover, a partir do momento em que você instalou o PPA: cat /var/log/dpkg.log | grep 'install'

4) remova todos os pacotes da etapa 3: sudo apt-get remove {lista de pacotes da etapa 3}

5) reinstale todos os pacotes da etapa 2: sudo apt-get install --reinstall {lista de pacotes da etapa 2}

6) Se tudo der errado e você não conseguir encontrar uma solução, volte a colocar o PPA e reinstale todos os pacotes das duas listas.

VincentSC
fonte
0

Sei que é uma pergunta bastante antiga, mas vim aqui em busca de ajuda e talvez eu possa ajudar alguém. Eu tive uma situação semelhante à do @ Karthik-T após a instalação unity8-desktop-session-mir. Eu sei que é um grande problema. Ele puxou 233 pacotes com ele.

Usando autoremoveeu sou removido apenas 34 deles. O ponto é que, durante a unity8-desktop-session-mirinstalação, ele removeu dois pacotes ( python3-aptdaemon.pkcompate evolution-data-server-online-accounts). É declarado em /var/log/apt/history.log, após a Installseção.

Para desfazer completamente a instalação do Unity 8, emiti o seguinte:

  1. sudo apt-get purge unity8-desktop-session-mir
  2. sudo apt-get --purge autoremove
  3. sudo apt-get install python3-aptdaemon.pkcompat evolution-data-server-online-accounts (ele removeu 8 pacotes relacionados ao Unity 8)
  4. sudo apt-get --purge autoremove

Isso não removerá absolutamente tudo o que você instalou antes, mas, em alguns casos, é bom o suficiente.

PS: talvez o autoremovepasso dois não seja necessário, como emitei novamente no passo quatro.


fonte
0

Tecnicamente, as operações "remover" ou "remover automaticamente" não são "desfazidas", embora possam ser feitas para fazer o trabalho suficientemente bem na maioria das vezes.

Por padrão, o apt-get deixará os pacotes para trás, a menos que você especifique -o APT::Suggests-Important=0 -o APT::Recommends-Important=0

É mais confiável dar uma olhada no apt history.loge desinstalar todos os pacotes instalados. Eu criei um pequeno script baseado em nó para facilitar o processo:

https://github.com/rolfen/apt-history

Além disso, aqui está outra abordagem mais manual para "reverter" as alterações:

https://unix.stackexchange.com/a/236711

Rolf
fonte