È possibile annullare un comando apt-get install?


67

Ho installato Carpadio sulla mia installazione di Xubuntu (una Live USB), che poi ha estratto come oltre 50 pacchetti dal lato Ubuntu del repository. Ora vorrei annullare questo. Tuttavia, per tutta la mia caccia, non riesco a trovare nulla di più utile di Come posso invertire sudo apt get install command , che suggerisce solo apt-get purge. Questo non è utile poiché tutto ciò che fa è rimuovere 2 pacchetti (carpadio e carpadio-gnomepanel).

/var/log/apt/history.logha un elenco di tutti i pacchetti installati insieme a quel comando. Quindi mi chiedevo se esiste un modo semplice per rimuoverli tutti ? Altrimenti posso solo reinstallare, questa è stata comunque una nuova installazione, ma sono curioso.

Un piccolo esempio del registro cronologico (1 / 5-1 / 10 dell'intero elenco)

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

A tutti coloro che hanno suggerito autoremove: non sono sicuro del perché, ma ho solo 1 altro pacchetto relativo a Python (python-keybinder o qualcosa del genere) come "non necessario" e questo è tutto ciò che autoremove è stato in grado di rimuovere.

Tra l'installazione e la disinstallazione, è stata installata solo la modifica principale xubuntu-restricted-extras.


4
In questo caso è un po 'tardi per essere d'aiuto, ma la prossima volta che vuoi installare qualcosa, considera di fare prima una simulazione. Esegui sudo apt-get install -s packagedove -sdenota una simulazione e packageverrà sostituito dal nome del software appropriato.

@ vasa1 Sì, mi sto battendo per questo. apt-get chiede anche [Y / n], che avrebbe dovuto essere il mio fuori ..
Karthik T

Ho ricevuto solo 1 altro pacchetto relativo a Python (python-keybinder o summat) come "non necessario" Hai effettivamente rimosso il cardapio-gnomepanelpacchetto?
gertvdijk,

@gertvdijk sì, ho apt-get remove carpadiopreso anche quello.
Karthik T

1
@KarthikT Allora sono completamente perso sul perché autoremovenon funziona per te. O in qualche modo hai contrassegnato tutti i pacchetti come installati manualmente ora o c'è un chiaro malinteso. È molto semplice: apt-get autoremoverimuove tutti i pacchetti contrassegnati installati automaticamente senza un motivo per averli ora. Se non funziona per te, penso che tu abbia cambiato qualcosa sul tuo sistema di cui non hai parlato nella tua domanda.
gertvdijk,

Risposte:


79

Fondamentalmente, dovrai entrambi apt-get remove(o apt-get purge) il pacchetto ed eseguirlo apt-get autoremovedopo, per ripristinare l'installazione di package-one.

Diamo un'occhiata a tutto il processo:

  • sudo apt-get install package-one installa 50 dipendenze contrassegnate come "automatiche" come si può vedere anche dall'estratto del registro nella domanda

  • sudo apt-get purge package-one Rimuove (purghe) solo uno, ma lo fanno funzionare questo!

    Tutte le seguenti azioni di installazione (se eseguite) produrranno un messaggio informativo con i pacchetti non più necessari:

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

    Questo elenco è fondamentalmente solo un elenco di tutti i pacchetti contrassegnati come "automatici" senza una dipendenza inversa da essi. In altre parole, non c'è motivo per installarli per quanto riguarda la gestione dei pacchetti.

    Nota: non è necessaria alcuna installazione! È solo per dimostrare che APT è intelligente per parlarti dei tuoi pacchetti non necessari!

  • sudo apt-get autoremove --purge rimuove (elimina) questi

Maggiori informazioni


2
In questo PO ha inserito Unity e tutti i suoi amici. Dubito che l'eliminazione del cardapio rimuoverà Unity ecc. Anche dopo l'autoremove.

@ vasa1 Perché? I pacchetti sono contrassegnati come 'installati automaticamente' (come si può vedere nella domanda) e se non si trova alcun motivo per quelli da installare sul sistema, verranno suggeriti per la rimozione usando autoremove.
gertvdijk,

Sì, mi chiedevo "automatico". Se questo serve a indicare l'autoremoval, va bene. OP non dovrebbe quindi avere problemi.

@gertvdijk buona cattura di @ vasa1, per favore vedi la mia modifica. autoremovenon ha aiutato.
Karthik T

@gertvdijk, per "Azioni successive all'installazione", sarebbe sudo apt-get updatesufficiente?

19

Quando si desidera rimuovere un pacchetto e le relative dipendenze installate in quel momento, è necessario utilizzare:

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

ma per annullare le aptazioni, puoi usare lo apt-undoscript. È uno script semplice che può annullare le aptazioni eseguite in Ubuntu. Va notato che questo script può funzionare solo se lo si utilizza invece di apt-getinstallare / aggiornare / rimuovere / eliminare / eseguire il downgrade dei pacchetti.

Per installare apt-undoin Ubuntu, eseguire i seguenti comandi nel terminale:

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

utilizzo:

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

Per annullare, le aptitudeazioni sopra riportate eseguono i seguenti comandi nel terminale:

apt-undo undo

1
Grazie, mi sono imbattuto in questo, e sembrava esattamente quello che il medico ha ordinato, fino a quando ho visto l'avvertimento che dovevo usare per installarlo, per poter annullare.
Karthik T

1
Bella presa. Sintassi molto confusa, comunque. E davvero non mi piace usare alternative all'applicazione APT core ben collaudata. Ancora +1!
gertvdijk,

7

Usa la potenza di Unix. Prendi la riga del file di registro che hai e costruisci un comando che annullerà ciò che ha fatto apt. Per esempio:

$ 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

Quindi puoi usare questa eliminazione per sbaglio tutti i pacchetti installati accidentalmente, data la riga appropriata dal tuo file di registro:

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

(Ho usato perlinvece sedperché sedusa un tipo di espressione regolare che non supporta le corrispondenze non avide, che era il modo più semplice di costruire ciò di cui avevo bisogno)


1
Bel copione, ma in realtà dovrebbe essere solo una sequenza di comandi che le persone possono ricordare per realizzarlo.
gertvdijk,

Grazie, sceneggiatura intimidatoria, ma temevo che sarebbe dipeso da questo
Karthik T

1
Ho usato un codice molto simile per risolvere il mio problema molto simile . L'ho fatto in diversi passaggi solo per essere più sicuro di ciò che stava accadendo. Per prima cosa ho copiato il blocco di testo pertinente dal aptregistro in un nuovo file e poi l' perl -pe 's/\(.*?\)(, )?//g' /path/to/apt-history.log ho applicato ad esso: poi tutto ciò che ho fatto è stato anteporre quell'output con sudo apt-get removeed ero pronto per partire!
Insperatus,

1

Dopo aver rimosso l'unico pacchetto, e si può rimuovere a fondo con l'aggiunta di --purge, per, apt-get remove --purge <package>si dovrebbe dare un messaggio che i pacchetti di libreria tirato in sono stati installati automaticamente e non è più necessario, a questo punto è possibile eseguire apt-get autoremovea rimuovili.


Grazie, ma autoremove si è rivelato insufficiente in questo caso. Si prega di vedere la mia modifica.
Karthik T,

1

Segui il sudo apt-get purge packagenamecon

sudo apt-get autoremove. 

A meno che non sia un metapacchetto, questo dovrebbe occuparsene.

Vedi anche le domande frequenti in Come rimuovo manualmente tutti i file Cardapio? .


Grazie, ma autoremove si è rivelato insufficiente in questo caso. Si prega di vedere la mia modifica. Grazie per il link FAQ, molto utile!
Karthik T

1
Alcuni di questi pacchetti potrebbero essere necessari per altre cose e non contrassegnati come capaci di essere rimossi. Hai guardato le istruzioni al link? Come sono quelli?
Chaskes,

Le istruzioni sul collegamento sono piuttosto ortogonali al problema principale e, al momento, mi sto impegnando per reinstallare il mio sistema. grazie comunque.
Karthik T

1
  1. Incollare la lunga lista di pacchetti indesiderati dal registro apt in a new_file.txt
  2. Eseguire perl -pe 's/\(.*?\)(, )?//g' /path/to/new_file.txt
  3. Copia l'output dell'ultimo comando negli appunti o esegui il pipe lì in primo luogo .
  4. Esegui sudo apt-get remove[incolla qui il contenuto degli appunti]

Fatto.

Fondamentalmente abbiamo bisogno di formattare l'elenco dei pacchetti dal registro apt in qualcosa che apt-get possa capire. La parentesi, le parole in mezzo e le virgole devono andare, quindi è lì che entra in gioco il perl. Sì, ci sono modi migliori (più efficienti), ma l'ho fatto, è facile da capire e funziona.


+1 per esperienza personale e spiegazione, ma come ho già detto in precedenza, ho già ripristinato il mio Live USB
Karthik T

1

Tecnicamente le operazioni "rimuovi" o "autoremove" non sono "annullate", sebbene possano essere fatte per fare il lavoro abbastanza bene la maggior parte delle volte.

Per impostazione predefinita, apt-get lascerà indietro i pacchetti, se non specificato -o APT::Suggests-Important=0 -o APT::Recommends-Important=0

È più affidabile dare un'occhiata a apt history.loge disinstallare tutti i pacchetti installati. Ho creato un piccolo script basato su nodo per facilitare il processo:

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

Inoltre, ecco un altro approccio più manuale al "rollback" delle modifiche:

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


1

Per annullare l'ultima installazione apt è possibile utilizzare anche qualcosa del genere:

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

Questo prenderà l'ultima installazione apt dalla cronologia e cancella tutti i pacchetti qui installati.

Puoi creare una funzione chiamata aptpurgelastinstall per averla sempre a portata di mano (aggiungerà il codice 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

Ora devi semplicemente digitare aptpurgelastinstall nella shell per ripetere l'ultima installazione.


Reagendo al commento della modifica suggerita : "Migliorato il mio post (prima che fossi registrato)". Puoi chiedere di unire i tuoi account, vedi askubuntu.com/help/merging-accounts .
Melebio

0

Se hai appena aggiunto un ppa e desideri ripristinare, devi eseguire i passaggi descritti di seguito. Comprendi che ciò può non riuscire, quando hai installato altri pacchetti che non desideri disinstallare. Sono sicuro che questo può essere fatto con una sceneggiatura. Personalmente penso che questo dovrebbe far parte di apt, e ci dovrebbe essere una migliore amministrazione di quali pacchetti sono installati a causa delle dipendenze e quali sono installati su richiesta dell'utente.

1) rimuovere il ppa da /etc/apt/sources.list Ricorda l'ora in cui hai aggiunto il ppa. Se sei fortunato, non devi essere preciso.

2) fai un elenco di cosa reinstallare, dal momento in cui hai installato il PPA: cat /var/log/dpkg.log | grep 'upgrade'

3) fai un elenco di cosa rimuovere, dal momento in cui hai installato il PPA: cat /var/log/dpkg.log | grep 'installa'

4) rimuovere tutti i pacchetti dal passaggio 3: sudo apt-get remove {elenco di pacchetti dal passaggio 3}

5) reinstallare tutti i pacchetti dal passaggio 2: sudo apt-get install --reinstall {elenco di pacchetti dal passaggio 2}

6) Se le cose sono andate male e non riesci a pensare a una soluzione, rimetti il ​​PPA e reinstalla tutti i pacchetti dai due elenchi.


0

So che è una domanda piuttosto vecchia, ma sono venuto qui in cerca di aiuto e forse posso aiutare qualcuno. Ho avuto una situazione simile a quella di @ Karthik-T dopo l'installazione unity8-desktop-session-mir. So che è grande. Ha tirato 233 pacchetti con lui.

Usando autoremovene rimuovo solo 34. Il punto è che durante l' unity8-desktop-session-mirinstallazione, ha rimosso due pacchetti ( python3-aptdaemon.pkcompate evolution-data-server-online-accounts). È indicato in /var/log/apt/history.log, dopo la Installsezione.

Per annullare completamente l'installazione di Unity 8 ho emesso quanto segue:

  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 (ha rimosso 8 pacchetti relativi a Unity 8)
  4. sudo apt-get --purge autoremove

Questo non rimuoverà assolutamente tutto ciò che hai installato prima, ma in alcuni casi è abbastanza buono.

PS: forse il autoremovepassaggio due non è necessario, come ho rilasciato di nuovo al passaggio quattro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.