¿Es posible deshacer un comando de instalación de apt-get?

67

Instalé Carpadio en mi instalación de Xubuntu (un Live USB), que luego extrajo como más de 50 paquetes, supongo, del lado de Ubuntu del repositorio. Ahora me gustaría deshacer esto. Sin embargo, para toda mi búsqueda, no puedo encontrar nada más útil que ¿Cómo puedo revertir el comando sudo apt get install , que solo sugiere apt-get purge? Esto no es útil ya que todo lo que hace es eliminar 2 paquetes (carpadio y carpadio-gnomepanel).

/var/log/apt/history.logtiene una lista de todos los paquetes que se instalaron junto con ese comando. Entonces, me preguntaba si hay alguna manera fácil de eliminarlos a todos . De lo contrario, puedo reinstalar, de todos modos esta fue una instalación nueva, pero tengo curiosidad.

Una pequeña muestra del registro del historial (1 / 5-1 / 10 de toda la lista)

Línea de comandos: apt-get install cardapio-gnomepanel
Instalar: 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), unity: amd64 (5.18.0-0ubuntu1, automático), impresoras indicadoras: amd64 (0.1.6-0ubuntu1, automático), libevolution: amd64 (3.2.3- 0ubuntu6, automático), libqt4-declarative: amd64 (4.8.1-0ubuntu4.3, automático), 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 aquellos que sugirieron autoremove: No estoy seguro de por qué, pero obtuve solo 1 paquete relacionado con Python (python-keybinder o algo así) como "innecesario" y eso es todo lo que Autoremove pudo eliminar.

Entre la instalación y la desinstalación, solo se instaló un cambio importante xubuntu-restricted-extras.

Karthik T
fuente
44
Es un poco tarde para ser de ayuda en este caso, pero la próxima vez que desee instalar algo, considere hacer una simulación primero. Ejecute sudo apt-get install -s packagedonde -sdenota una simulación y packageserá reemplazado por el nombre del software apropiado.
@ vasa1 Sí, me estoy castigando por esto. apt-get pregunta [S / n] también, esa debería haber sido mi salida ..
Karthik T
Tengo solo 1 paquete relacionado con python (python-keybinder o summat) como "innecesario" ¿Realmente eliminó el cardapio-gnomepanelpaquete?
gertvdijk
@gertvdijk sí, también se lo apt-get remove carpadiollevó.
Karthik T
1
@KarthikT Entonces estoy completamente perdido en cuanto a por qué autoremoveno funciona para ti. O de alguna manera marcó todos los paquetes como instalados manualmente ahora o hay un simple malentendido. Es muy simple: apt-get autoremovesimplemente elimina todos los paquetes marcados instalados automáticamente sin una razón para tenerlos ahora. Si no funciona para usted, creo que ha cambiado algo en su sistema que no mencionó en su pregunta.
gertvdijk

Respuestas:

79

Básicamente, tendrá que ejecutar ambos apt-get remove(o apt-get purge) el paquete y ejecutarlo apt-get autoremovepara que revierta la instalación package-one.

Veamos todo el proceso:

  • sudo apt-get install package-one instala 50 dependencias con él marcado "automático" como también se puede ver en el extracto de registro en su pregunta

  • sudo apt-get purge package-one Remueve (purgas) sólo uno, sino hacer funcionar esto!

    Todas las siguientes acciones de instalación (si ejecuta alguna) generarán un mensaje informativo con los paquetes que ya no se necesitan:

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

    Esta lista es básicamente una lista de todos los paquetes marcados como "automáticos" sin una dependencia inversa de ellos. En otras palabras, no hay razón para que se instalen en lo que respecta a la gestión de paquetes.

    Nota: ¡No se necesita instalación! ¡Es solo para demostrar que APT es inteligente para informarle sobre sus paquetes innecesarios!

  • sudo apt-get autoremove --purge elimina (purga) estos

Más información

gertvdijk
fuente
2
En este OP ha atraído a Unity y a todos sus amigos. Dudo que la purga de cardapio elimine Unity, etc. incluso después de la eliminación automática.
@ vasa1 ¿Por qué? Los paquetes están marcados como 'instalados automáticamente' (como se puede ver en la pregunta) y si no se puede encontrar ninguna razón para instalarlos en el sistema, se les sugerirá su eliminación autoremove.
gertvdijk
Sí, me preguntaba sobre el "automático". Si eso sirve para indicar la autoextracción, está bien. OP no debería tener problemas entonces.
@gertvdijk buena captura de @ vasa1, por favor vea mi edición. autoremoveno ayudó.
Karthik T
@gertvdijk, para "Acciones de instalación posteriores", ¿ sudo apt-get updatesería suficiente?
19

Cuando desee eliminar un paquete y sus dependencias que se instalaron en ese momento, debe usar:

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

pero para deshacer aptacciones, puede usar apt-undoscript. Es un script simple que puede deshacer las aptacciones realizadas en Ubuntu. Cabe señalar que este script solo puede funcionar si lo usa en lugar de apt-getinstalar / actualizar / eliminar / purgar / degradar sus paquetes.

Para instalar apt-undoen Ubuntu, ejecute los siguientes comandos en la 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 deshacer, las aptitudeacciones anteriores ejecutan los siguientes comandos en el terminal:

apt-undo undo
Ramin
fuente
1
Gracias, me encontré con esto, y sonaba exactamente como lo había recetado el médico, hasta que vi la advertencia de que necesitaba usarla para instalar, para poder deshacer ...
Karthik T
1
Buena atrapada. Sintaxis muy confusa, sin embargo. Y realmente no me gusta usar alternativas a la aplicación APT central bien probada. Todavía +1!
gertvdijk
7

Usa el poder de Unix. Tome la línea del archivo de registro que tiene y cree un comando que deshaga lo que hizo apt. Por ejemplo:

$ 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

Para que pueda utilizar esta purga todos los paquetes que instaló accidentalmente, dada la línea apropiada de su archivo de registro:

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

(Lo he usado en perllugar de sedporque sedusa un tipo de expresión regular que no admite coincidencias no codiciosas, que era la forma más fácil de construir lo que necesitaba)

Robie Basak
fuente
1
Buen script, pero en realidad debería ser solo una secuencia de comandos que las personas puedan recordar para lograrlo.
gertvdijk
Gracias, guión intimidante, pero temía que todo se redujera a esto
Karthik T
1
Usé un código muy similar para resolver mi problema muy similar . Lo hice en varios pasos solo para estar más seguro de lo que estaba sucediendo. Primero copié el bloque de texto relevante del aptregistro en un nuevo archivo y luego lo apliqué: ¡ perl -pe 's/\(.*?\)(, )?//g' /path/to/apt-history.log Entonces todo lo que hice fue anteponer esa salida sudo apt-get removey listo!
Insperatus 01 de
1

Después de quitar el paquete, y puede eliminarlo completamente mediante la adición de --purge, para, apt-get remove --purge <package>, se debe dar un mensaje de que los programas para bibliotecas, en tirada eran instalan automáticamente y ya no es necesario, momento en el que se puede ejecutar apt-get autoremovea eliminarlos

Ken Kinder
fuente
Gracias, pero la eliminación automática demostró ser insuficiente en este caso. Por favor vea mi edición.
Karthik T
1

Sigue el sudo apt-get purge packagenamecon

sudo apt-get autoremove. 

A menos que sea un metapaquete, esto debería encargarse.

Consulte también las preguntas frecuentes en ¿Cómo elimino manualmente todos los archivos de Cardapio? .

chaskes
fuente
Gracias, pero la eliminación automática demostró ser insuficiente en este caso. Por favor vea mi edición. Gracias por el enlace de preguntas frecuentes, ¡muy útil!
Karthik T
1
Algunos de esos paquetes pueden ser necesarios para otras cosas y no están marcados como capaces de ser eliminados automáticamente. ¿Viste las instrucciones en el enlace? Como estan esos
chaskes
Las instrucciones en el enlace son bastante ortogonales al problema central y, tal como están las cosas, me inclino por reinstalar mi sistema. gracias de cualquier manera.
Karthik T
1
  1. Pegue la larga lista de paquetes no deseados del registro de apt en un new_file.txt
  2. Ejecutar perl -pe 's/\(.*?\)(, )?//g' /path/to/new_file.txt
  3. Copie la salida del último comando al portapapeles o póngala allí en primer lugar .
  4. Ejecutar sudo apt-get remove[pegue el contenido del portapapeles aquí]

Hecho.

Básicamente, necesitamos formatear la lista de paquetes del registro de apt en algo que apt-get pueda entender. El paréntesis, las palabras intermedias y las comas deben ir, así que ahí es donde entra en juego el perl. Sí, hay formas mejores (más eficientes), pero lo he hecho, es fácil de entender y funciona.

Insperatus
fuente
+1 para experiencia personal y explicación, pero como mencioné anteriormente, ya reinicié mi Live USB
Karthik T
1

Para deshacer la última instalación de apt, también puede usar algo como esto:

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

Esto capturará la última instalación apta del historial y purgará todos los paquetes instalados aquí.

Puede crear una función llamada aptpurgelastinstall para tenerla siempre a mano (agregará el 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

Ahora simplemente necesita escribir aptpurgelastinstall en el shell para rehacer la última instalación.

usuario981297
fuente
En respuesta al comentario de la edición sugerida : "Mejoré mi propia publicación (antes de que me registrara)". Puede solicitar la fusión de sus cuentas, consulte askubuntu.com/help/merging-accounts .
Melebius
0

Si acaba de agregar un ppa y desea revertir, debe realizar los pasos que se describen a continuación. Comprenda que esto puede fallar cuando haya instalado otros paquetes que no desea desinstalar. Estoy seguro de que esto se puede hacer con un script. Personalmente, creo que esto debería ser parte de apt, y debería haber una mejor administración de qué paquetes se instalan debido a las dependencias y cuáles se instalan a pedido del usuario.

1) elimine el ppa de /etc/apt/sources.list Recuerde la hora en que agregó el ppa. Si tienes suerte, no necesitas ser preciso.

2) haga una lista de qué reinstalar, desde el momento en que instaló el PPA: cat /var/log/dpkg.log | grep 'actualización'

3) haga una lista de lo que debe eliminar, desde el momento en que instaló el PPA: cat /var/log/dpkg.log | grep 'instalar'

4) elimine todos los paquetes del paso 3: sudo apt-get remove {lista de paquetes del paso 3}

5) reinstale todos los paquetes del paso 2: sudo apt-get install --reinstall {lista de paquetes del paso 2}

6) Si las cosas salieron mal y no puede pensar en una solución, vuelva a colocar el PPA y reinstale todos los paquetes de las dos listas.

VincentSC
fuente
0

Sé que es una pregunta bastante antigua, pero vine aquí buscando ayuda y tal vez pueda ayudar a alguien. Tuve una situación similar a la de @ Karthik-T después de la instalación unity8-desktop-session-mir. Sé que es grande. Sacó 233 paquetes con él.

Utilizando autoremoveme eliminan solo 34 de ellos. El punto es que durante la unity8-desktop-session-mirinstalación, eliminó dos paquetes ( python3-aptdaemon.pkcompaty evolution-data-server-online-accounts). Se indica en /var/log/apt/history.log, después de la Installsección.

Para deshacer completamente la instalación de Unity 8, emití lo siguiente:

  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 (eliminó 8 paquetes relacionados con Unity 8)
  4. sudo apt-get --purge autoremove

Esto no eliminará absolutamente todo lo que instaló antes, pero en algunos casos es lo suficientemente bueno.

PD: tal vez el autoremovepaso dos no sea necesario, ya que emití nuevamente en el paso cuatro.


fuente
0

Técnicamente, las operaciones de "eliminar" o "quitar automáticamente" no se "deshacen", aunque se puede hacer que hagan el trabajo lo suficientemente bien la mayoría de las veces.

De forma predeterminada, apt-get dejará paquetes atrás, a menos que especifique -o APT::Suggests-Important=0 -o APT::Recommends-Important=0

Es más confiable echar un vistazo a apt history.logy desinstalar todos los paquetes instalados. He creado un pequeño script basado en nodos para facilitar el proceso:

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

Además, aquí hay otro enfoque más manual para "retroceder" los cambios:

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

Rolf
fuente