Можно ли отменить команду apt-get install?

67

Я установил Carpadio на мою установку Xubuntu (Live USB), которая затем вытащила более 50 пакетов, как я полагаю, со стороны Ubuntu хранилища. Теперь я хотел бы отменить это. Однако, несмотря на всю мою охоту, я не могу найти ничего более полезного, чем Как я могу отменить команду sudo apt get install , которая просто предлагает apt-get purge. Это бесполезно, поскольку все, что он делает - это удаляет 2 пакета (carpadio и carpadio-gnomepanel).

/var/log/apt/history.logимеет список всех пакетов, которые были установлены вместе с этой командой. Так что мне было интересно, есть ли простой способ удалить их все ? Еще я могу просто переустановить, это была новая установка в любом случае, но мне любопытно.

Небольшой образец журнала истории (1 / 5-1 / 10 от всего списка)

Командная строка: apt-get устанавливает cardapio-gnomepanel
Установить: libdbusmenu-qt2: amd64 (0.9.2-0ubuntu1, автоматический), python-packagekit: amd64 (0.7.2-4ubuntu3, автоматический), cups-pk-helper: amd64 (0.2.1.2-1ubuntu0.1, автоматический) , geoclue: amd64 (0.12.0-1ubuntu12, автоматический), unity: amd64 (5.18.0-0ubuntu1, автоматический), индикаторные принтеры: amd64 (0.1.6-0ubuntu1, автоматический), libevolution: amd64 (3.2.3- 0ubuntu6, автоматический), libqt4-декларативный: amd64 (4.8.1-0ubuntu4.3, автоматический), libmtp9: amd64 (1.1.3-1ubuntu0.1, автоматический), tracker-miner-fs: amd64 (0.14.0-2ubuntu1 , автоматический), gir1.2-rb-3.0: amd64 (2.96-0ubuntu4.2, автоматический), python-aptdaemon.pkcompat: amd64 (0.43 + bzr805-0ubuntu7, автоматический), gnome-media: amd64 (3.4.0- 0ubuntu3.1, автоматический), metacity: amd64 (2.34.1-1ubuntu11, автоматический), nautilus: amd64 (3.4.2-0ubuntu6, автоматический), libcompizconfig0: amd64 (0.9.7.0 ~ bzr428-0ubuntu6, автоматический), compiz- плагинов по умолчанию:amd64 (0.9.7.12-0ubuntu1, автоматический), libunistring0: amd64 (0.9.3-5, автоматический), libebackend-1.2-1: amd64 (3.2.3-0ubuntu7, автоматический), ubuntu-docs: amd64 (12.04.6 , автоматический), python-mako: amd64 (0.5.0-1, автоматический),

Всем тем, кто предложил autoremove: я не уверен, почему, но я получил только 1 другой пакет, связанный с python (python-keybinder или что-то), как «ненужный», и это все, что удалось удалить с помощью autoremove.

Между установкой и удалением устанавливались только основные изменения xubuntu-restricted-extras.

Картик Т
источник
4
В этом случае будет немного поздно, но в следующий раз, когда вы захотите что-то установить, сначала подумайте о симуляции. Выполнить, sudo apt-get install -s packageгде -sобозначает симуляцию и packageбудет заменено соответствующим именем программного обеспечения.
@ vasa1 Да, я бьюсь об этом. apt-get также спрашивает [Y / n], это должно было быть моим выходом ..
Karthik T
Я получил только 1 другой пакет, связанный с Python (python-keybinder или summat) как «ненужный». Вы действительно удалили cardapio-gnomepanelпакет?
gertvdijk
@gertvdijk Да, apt-get remove carpadioвзял это тоже.
Karthik T
1
@KarthikT Тогда я совершенно заблудился, почему autoremoveне работает на тебя. Либо вы каким-то образом пометили все пакеты как установленные вручную, либо есть недоразумение. Это очень просто: apt-get autoremoveпросто удаляет все автоматически установленные помеченные пакеты без причины иметь их сейчас. Если это не работает для вас, я думаю, что вы изменили что-то в своей системе, о чем вы не сказали в своем вопросе.
gertvdijk

Ответы:

79

По сути, вам придется как apt-get remove(или apt-get purge) пакет и запустить apt-get autoremoveпосле этого, чтобы он отменил установку package-one.

Давайте посмотрим на весь процесс:

  • sudo apt-get install package-one устанавливает 50 зависимостей с пометкой «автоматическая», что также видно из выдержки из журнала в вашем вопросе

  • sudo apt-get purge package-one удаляет (Чистки) только один, но сделать запускаю это!

    Все последующие действия по установке (если вы выполняете какие-либо) приведут к информационному сообщению с ненужными пакетами:

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

    Этот список в основном представляет собой список всех пакетов, помеченных как «автоматические» без обратной зависимости от них. Другими словами, для управления пакетами нет причин устанавливать их.

    Примечание: установка не требуется! Просто чтобы продемонстрировать, что APT умно расскажет вам о ваших ненужных пакетах!

  • sudo apt-get autoremove --purge удаляет (удаляет) эти

Больше информации

  • Официальная документация на autoremoveс apt-get(8)manpage:

    autoremove используется для удаления пакетов, которые были автоматически установлены для удовлетворения зависимостей других пакетов и теперь больше не нужны.

  • Как правильно полностью удалить приложение?

gertvdijk
источник
2
В этот ОП втянулся Unity и все его друзья. Я сомневаюсь, что очистка кардапио удалит Unity и т. Д. Даже после автоматического удаления.
@ vasa1 Почему? Пакеты помечаются как «автоматически установленные» (как видно из вопроса), и если не будет найдено причин для установки в систему, они будут предложены для удаления с помощью autoremove.
gertvdijk
Да, мне было интересно про «автомат». Если это служит для указания на автоматическое удаление, это хорошо. У ОП не должно быть проблем.
@gertvdijk хороший улов @ vasa1, пожалуйста, смотрите мои изменения. autoremoveне помогло.
Картик Т
@gertvdijk, для "Последующих действий по установке", будет sudo apt-get updateдостаточно?
19

Если вы хотите удалить пакет и его зависимости, установленные на тот момент, вы должны использовать:

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

но чтобы отменить aptдействия, вы можете использовать apt-undoскрипт. Это простой скрипт, который может отменить aptдействия, выполняемые в Ubuntu. Следует отметить, что этот скрипт может работать, только если вы используете его вместо apt-getустановки / обновления / удаления / очистки / понижения ваших пакетов.

Для установки apt-undoв Ubuntu выполните следующие команды в терминале:

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

использование:

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

Для отмены вышеуказанных aptitudeдействий выполните следующие команды в терминале:

apt-undo undo
Рамин
источник
1
Спасибо, я сталкивался с этим, и это звучало как то, что доктор прописал, пока я не увидел предостережение, которое мне нужно было использовать, чтобы установить, чтобы иметь возможность отменить ..
Karthik T
1
Хорошо поймал. Впрочем, очень запутанный синтаксис. И я действительно не люблю использовать альтернативы хорошо протестированным основным приложениям APT. Еще +1!
gertvdijk
7

Используйте силу Unix. Возьмите строку файла журнала, которая у вас есть, и создайте команду, которая отменит то, что сделал apt. Например:

$ 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

Таким образом, вы можете использовать эту очистку всех пакетов, которые вы случайно установили, учитывая соответствующую строку из вашего файла журнала:

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

(Я использовал perlвместо, sedпотому что sedиспользует тип регулярного выражения, который не поддерживает несжадные совпадения, что было самым простым способом создания того, что мне нужно)

Роби Басак
источник
1
Хороший сценарий, но на самом деле это должна быть просто последовательность команд, которую люди могут запомнить для выполнения.
gertvdijk
Спасибо, пугающий сценарий, но я боялся, что это сводится к этому
Karthik T
1
Я использовал очень похожий код для решения моей очень похожей проблемы . Я сделал это в несколько шагов, просто чтобы быть более уверенным в происходящем. Сначала я скопировал соответствующий блок текста из aptжурнала в новый файл, а затем применил к нему следующее: perl -pe 's/\(.*?\)(, )?//g' /path/to/apt-history.log Затем все, что я сделал, это добавил этот вывод, sudo apt-get removeи я был готов идти!
Insperatus
1

После того, как вы удалите один пакет, и вы можете удалить его полностью, добавив --purge, ибо apt-get remove --purge <package>, это должно дать вам сообщение о том , что библиотека пакетов он тянул в были установлены автоматически , и больше нет необходимости, в этот момент вы можете запустить apt-get autoremoveв удалить их.

Кен Киндер
источник
Спасибо, но автоудаление оказалось недостаточным в этом случае. Пожалуйста, смотрите мое редактирование.
Karthik T
1

Следуйте sudo apt-get purge packagenameс

sudo apt-get autoremove. 

Если это не метапакет, это должно заботиться об этом.

Также см. Часто задаваемые вопросы в разделе Как вручную удалить все файлы Cardapio? ,

chaskes
источник
Спасибо, но автоудаление оказалось недостаточным в этом случае. Пожалуйста, смотрите мое редактирование. Спасибо за ссылку FAQ, очень полезно!
Karthik T
1
Некоторые из этих пакетов могут быть необходимы для других целей и не помечены как автоматически удаляемые. Вы смотрели инструкции по ссылке? Как это?
chaskes
Инструкции по ссылке довольно ортогональны по отношению к основной проблеме, и, как она есть, я склоняюсь к переустановке моей системы. Спасибо, в любом случае.
Картик Т
1
  1. Вставьте длинный список нежелательных пакетов из журнала apt в new_file.txt
  2. казнить perl -pe 's/\(.*?\)(, )?//g' /path/to/new_file.txt
  3. Скопируйте вывод последней команды в буфер обмена или передайте ее туда в первую очередь .
  4. Выполнить sudo apt-get remove[вставить содержимое буфера обмена здесь]

Готово.

По сути, нам нужно отформатировать список пакетов из журнала apt во что-то, что apt-get сможет понять. Круглые скобки, слова между ними и запятые должны быть указаны так, чтобы Perl начал играть. Да, есть лучшие (более эффективные) способы - но я сделал это, это легко понять, и это работает.

Insperatus
источник
+1 за личный опыт и объяснения, но, как я упоминал ранее, я уже сбросил свой Live USB
Karthik T
1

Технически операции «удалить» или «автоудаление» не являются «отменой», хотя их можно сделать, чтобы выполнять работу достаточно хорошо в большинстве случаев.

По умолчанию apt-get оставит пакеты, если вы не укажете -o APT::Suggests-Important=0 -o APT::Recommends-Important=0

Надежнее взглянуть на apt history.logи удалить все установленные пакеты. Я создал небольшой скрипт на основе узла, чтобы упростить процесс:

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

Кроме того, вот еще один, более ручной подход к «откату» изменений:

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

Рольф
источник
1

Чтобы отменить последнюю установку, вы также можете использовать что-то вроде этого:

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

Это отловит последнюю удачную установку из истории и удалит все установленные здесь пакеты.

Вы можете создать функцию с именем aptpurgelastinstall, чтобы она всегда была под рукой (добавит код в ~ / .bashrc):

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

Теперь вам просто нужно набрать aptpurgelastinstall в оболочке, чтобы повторить последнюю установку.

user981297
источник
Реакция на предложенный комментарий к редактированию : «Улучшена моя собственная запись (до того, как я зарегистрировался)». Вы можете попросить объединить свои учетные записи, см. Askubuntu.com/help/merging-accounts .
Мелебиус
0

Если вы только что добавили ppa и хотите вернуться, вам нужно выполнить шаги, описанные ниже. Поймите, что это может не сработать, если вы установили другие пакеты, которые не хотите удалять. Я уверен, что это можно сделать с помощью сценария. Лично я думаю, что это должно быть частью apt, и должно быть лучше администрирование, какие пакеты установлены из-за зависимостей, а какие установлены по запросу пользователя.

1) удалите ppa из /etc/apt/sources.list Помните время, когда вы добавили ppa. Если вам повезет, вам не нужно быть точным.

2) составьте список того, что нужно переустановить, с момента установки PPA: cat /var/log/dpkg.log | grep 'upgrade'

3) составьте список того, что нужно удалить, с момента установки PPA: cat /var/log/dpkg.log | grep 'install'

4) удалить все пакеты с шага 3: sudo apt-get remove {список пакетов с шага 3}

5) переустановите все пакеты из шага 2: sudo apt-get install --reinstall {список пакетов из шага 2}

6) Если что-то пошло не так, и вы не можете придумать решение, верните PPA и переустановите все пакеты из двух списков.

VincentSC
источник
0

Я знаю, что это довольно старый вопрос, но я пришел сюда в поисках помощи, и, возможно, я могу кому-то помочь. У меня была ситуация, похожая на @ Karthik-T, после установки unity8-desktop-session-mir. Я знаю, что это большой. Это потянуло 233 пакета с ним.

С помощью autoremoveменя удаляются только 34 из них. Дело в том, что во время unity8-desktop-session-mirустановки было удалено два пакета ( python3-aptdaemon.pkcompatи evolution-data-server-online-accounts). Об этом говорится в разделе /var/log/apt/history.logпосле Install.

Чтобы полностью отменить установку Unity 8, я выпустил следующее:

  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 (удалено 8 пакетов, связанных с Unity 8)
  4. sudo apt-get --purge autoremove

Это не удалит абсолютно все, что вы установили ранее, но в некоторых случаях достаточно хорошо.

PS: возможно, autoremoveна втором шаге нет необходимости, как я выпустил снова на четвертом шаге.


источник