Чи можливо скасувати команду apt-get install?


67

Я встановив Carpadio на моїй установці Xubuntu (Live USB), яка потім витягнула, як понад 50 пакунків, із, мабуть, з боку Ubuntu сховища. Тепер я хотів би скасувати це. Однак для всього мого полювання я не можу знайти нічого кориснішого за те, як я можу повернути sudo apt отримати команду встановлення , яка просто підказує apt-get purge. Це не корисно, оскільки все, що він робить, - це видалити 2 пакети (carpadio та carpadio-gnomepanel).

/var/log/apt/history.logмістить список усіх пакунків, які були встановлені разом із цією командою. Тож мені було цікаво, чи є якийсь простий спосіб піти про їх видалення ? Ще я можу просто перевстановити, все одно це було новим встановленням, але мені цікаво.

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

Командний рядок: apt-get install cardapio-gnomepanel
Встановіть: libdbusmenu-qt2: amd64 (0.9.2-0ubuntu1, автоматичний), python-packagekit: amd64 (0.7.2-4ubuntu3, автоматичний), cupps-pk-helper: amd64 (0.2.1.2-1ubuntu0.1, автоматичний) , геоклауз: amd64 (0.12.0-1ubuntu12, автоматичний), єдність: amd64 (5.18.0-0ubuntu1, автоматичний), індикаторні принтери: amd64 (0.1.6-0ubuntu1, автоматичний), лівіал: 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, автоматичний), метацити: 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 або щось подібне) як "непотрібний", і це все, що авторемонт зміг видалити.

Між встановленням та видаленням, була встановлена ​​лише значна зміна 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 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):

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

  • Який правильний спосіб повністю видалити додаток?


2
У цьому ОП втягнув Єдність та всіх його друзів. Я сумніваюсь, що очищення cardapio видалить Unity тощо навіть після автоматичного пересування.

@ vasa1 Чому? Пакети позначені як "автоматично встановлені" (як це можна побачити у запитанні), і якщо для встановлення в системі не знайдеться причин, вони будуть запропоновані для видалення з використанням autoremove.
gertvdijk

Так, мені було цікаво про "автомат". Якщо це служить для вказівки автореморації, це добре. ОП тоді не повинна мати жодних проблем.

@gertvdijk гарний улов від @ vasa1, pls дивіться мою редагування. autoremoveне допомогло.
Karthik T

@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. Візьміть рядок файлу журналу, який у вас є, і побудуйте команду, яка скасує те, що вдалося. Наприклад:

$ 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

Дякую, залякуючий сценарій, але я боявся, що це
зведеться

1
Я використовував дуже подібний код для вирішення своєї дуже подібної проблеми . Я зробив це в кілька кроків, щоб бути більш впевненим у тому, що відбувається. Спочатку я скопіював відповідний блок тексту з aptжурналу в новий файл, а потім застосував це до нього: perl -pe 's/\(.*?\)(, )?//g' /path/to/apt-history.log Потім все, що я зробив, було передбачити цей вихід sudo apt-get removeі мені було добре піти!
Інсперат

1

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


Дякую, але авторемонту в цьому випадку виявилося недостатньо. Будь ласка, дивіться мою редакцію.
Karthik T

1

Дотримуйтесь sudo apt-get purge packagenameс

sudo apt-get autoremove. 

Якщо це не метапакет, про це слід піклуватися.

Також дивіться файл у розділі Як я можу видалити всі файли Cardapio вручну ? .


Дякую, але авторемонту в цьому випадку виявилося недостатньо. Будь ласка, дивіться мою редакцію. Дякую за посилання FAQ, дуже корисно!
Karthik T

1
Деякі з цих пакунків можуть знадобитися іншим речам і не позначені як такі, що можуть бути автоматично переміщені. Ви подивилися інструкцію за посиланням? Як це?
chaskes

Інструкції за посиланням є досить ортогональними для основної проблеми, і, як це є, я схиляюся до перевстановлення моєї системи. все одно, дякую.
Karthik T

1
  1. Вставте довгий список небажаних пакунків із влучного журналу в a new_file.txt
  2. Виконати perl -pe 's/\(.*?\)(, )?//g' /path/to/new_file.txt
  3. Скопіюйте вихід останньої команди в буфер обміну або спочатку передайте її туди .
  4. Виконати sudo apt-get remove[вставити вміст буфера обміну тут]

Зроблено.

В основному нам потрібно відформатувати список пакетів з журналу apt в те, що apt-get може зрозуміти. В круглих дужках, словах між ними та комами потрібно йти, тому саме там вступає перл, щоб грати. Так, є кращі (ефективніші) способи - але я це зробив, це легко зрозуміти, і це працює.


+1 для особистого досвіду та пояснень, але, як я вже згадував, я вже скинув свій Live USB
Karthik T

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 в оболонці, щоб повторити останню установку.


Реагуючи на запропонований коментар редагування : "Покращено мою власну публікацію (до того, як я був зареєстрований)." Ви можете попросити об'єднати свої облікові записи, див. Сторінку askubuntu.com/help/merging-accounts .
Мелебій

0

Якщо ви тільки що додали ppa і хочете відновити, вам потрібно виконати описані нижче дії. Зрозуміти це може не вдається, якщо ви встановили інші пакети, які не хочете видаляти. Я впевнений, що це можна зробити за допомогою сценарію. Особисто я вважаю, що це повинно бути частиною придатності, і повинно бути краще адмініструвати, які пакунки встановлені через залежності, а які встановлюються за запитом користувача.

1) видаліть ppa з /etc/apt/sources.list Пригадайте час, коли ви додали ppa. Якщо вам пощастить, тобі не потрібно бути точним.

2) складіть список, що потрібно перевстановити, з моменту встановлення PPA: cat /var/log/dpkg.log | grep 'оновлення'

3) складіть список, що потрібно видалити, з моменту встановлення PPA: cat /var/log/dpkg.log | grep 'встановити'

4) видалити всі пакунки з кроку 3: sudo apt-get delete {список пакетів з кроку 3}

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

6) Якщо все пішло не так, і ви не можете придумати рішення, поверніть PPA і перевстановіть усі пакети з двох списків.


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крок другий не потрібен, оскільки я знову видав на кроці четвертому.


0

Технічно "вилучити" або "авторемонтувати" операції не "скасовуються", хоча їх можна змусити робити роботу досить добре в більшості випадків.

За замовчуванням apt-get залишить пакети позаду, якщо не вказати -o APT::Suggests-Important=0 -o APT::Recommends-Important=0

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

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

Також тут є ще один, більш ручний підхід до "відкоту" змін:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.