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


546

Я шукав у мережі таку інформацію та знаходив різні командні рядки, як-от такі:

sudo apt-get remove application
sudo apt-get remove application*

sudo apt-get remove --purge application
sudo apt-get remove --purge application*

sudo apt-get purge application
sudo apt-get purge application*

Отже, який правильний шлях? Чи потрібно використовувати це "*"?

Після цього я також знайшов ці команди:

sudo updatedb
sudo locate application
sudo rm -rf (file/folder name)

1
На деякі ваші запитання можуть відповісти в цьому дописі: askubuntu.com/questions/1143/how-can-i-uninstall-software
Glutanimate

8
application*може при нагоді давати несподівані результати - наприклад, якщо у вас є файл у поточному каталозі з іменем application_information, оболонка розширить його, перш ніж він буде переданий apt-get. Якщо це відбувається, і ви хочете буквальну зірочку, можете скористатися application\*або'application*'
Izkata

6
application*ще небезпечніше там, де в поточному каталозі немає файлів: apt-getвикористовуються регулярні вирази, немає шаблонів глобуса. Люди майже витерли всю систему, намагаючись видалити wine*.
Андреа Корбелліні

3
Чи можете ви прийняти відповідь? Щоб бути вдячним людям, які відповіли вам.
m-ric

Ні, application*ні application\*безпечно! Цитування *з \або ' 'лише збільшує ризик, переконавшись, що *це передано як є apt-get(хоча це, як правило, так і є!), Змушує apt-getінтерпретувати аргумент як регулярний вираз. У регулярному вираженні *означає "нуль або більше попереднього символу". Поширена форма помилки є видалення wine*, видалення всіх пакетів з win(НЕ wine, win) де - небудь в їх іменах і все пакетах в залежності від якого - або з них. Дивіться це пояснення та можливі виправлення . @Izkata
Kagan

Відповіді:


705
  • apt-get remove packagename

    видалить двійкові файли, але не файли конфігурації чи даних пакета packagename. Він також залишить встановлені з ним залежності від часу встановлення недоторканими.

  • apt-get purge packagename або apt-get remove --purge packagename

    видалить про все, що стосується пакета packagename, але не залежність, встановлену разом з ним від встановлення. Обидві команди рівноцінні.

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

  • apt-get autoremove

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

  • aptitude remove packagenameабо aptitude purge packagename(аналогічно)

    також намагатиметься видалити інші пакунки, які вимагалися packagenameувімкнено, але не потрібні інші пакети. Зауважте, що aptitudeзапам'ятовується лише інформація про залежність для встановлених нею пакетів.

І ще багато існує. dpkgМожна використовувати команди ( нижчі рівні ) або такі інструменти графічного інтерфейсу, як Muon, Synaptic, Software Center тощо. Немає єдиного "правильного способу" видалення програм або виконання інших завдань, що взаємодіють з управлінням пакетом.

Список, який ви знайшли, - лише приклади. Переконайтесь, що ви розумієте значення та спробуйте, що він хоче зробити, перш ніж прийняти дію (потрібно натиснути, Yперш ніж він дійсно виконує дії, як було запропоновано).

Версія зірочки у питанні, ймовірно, неправильна ; apt-getприймає регулярний вираз, а не глобусний візерунок як оболонку. Отже, що відбувається з

sudo apt-get remove application*

наступне:

  1. Оболонка намагається розширити, application*дивлячись на файли в поточному каталозі. Якщо (як це буває в нормі) він нічого не знаходить, він повертає глобальний шаблон без змін (припустимо, що bashтут поведінка за замовчуванням --- zshбуде помилкою).

  2. apt-getвидалять пакети, ім'я яких містить рядок , яка задовольняє регулярний вираз application*, тобто, з applicatioподальшими довільним числом n: applicatio, application, applicationn, libapplicatioі т.д.

  3. Щоб побачити, як це може бути небезпечно, спробуйте (без кореня для подвійної безпеки) apt-get -s remove "wine*"( -sбуде імітувати річ, а не робити) --- вона скаже, що збирається видалити всі пакунки, які "виграли" у своєму імені та залежних, майже вся система ...

Напевно, команда, яка мала на увазі, є насправді

 sudo apt-get remove "^application.*"

(зверніть увагу на лапки та крапку), що видалить усі пакунки, з назви яких починається application.

Ці команди,

sudo updatedb                  # <-- updates the locate database (index). harmless
sudo locate application        # <-- locates the file 'application'. harmless
sudo rm -rf (file/folder name) # <-- removes files/dirs recursively. dangerous.

знаходяться повністю поза сферою управління пакетами. Не видаляйте файли, що належать до пакетів, не використовуючи менеджер пакунків! Це заплутається і є неправильним способом робити речі.

Якщо ви не знаєте, до якого пакету належить файл, спробуйте це:

dpkg -S /path/to/file

9
Опція --purge також зручна при спробі повністю усунути всі залишки залежностей, включаючи їх конфігураційні файли: apt-get-autoremove --purge Також важливо зазначити, що параметри --purge не впливають на файли конфігурації у вашому домашньому каталозі. Їх вам доведеться видалити вручну.
Glutanimate

1
Тут виникла помилка: apt-get приймає RE, а не глобуси; тому apt-get remove pack * видалить усі пакунки, що починаються з pac, а потім нуль або більше k ..., що зазвичай несподівано. Я редагував ансер. Дивіться також askubuntu.com/questions/210976/…
Rmano

Я думаю, що ця відповідь вже не є точною. Будь-яка apt remove -s texlive*або її apt-getаналогічна лінія повернення, така як Note, selecting 'texlive-font-utils' for glob 'texlive*'(мається на увазі, що вони дійсно приймають глобуси), а потім звичайні Package 'texlive-common' is not installed, so not removedта, нарешті, Remvлінії, такі як Remv texlive-font-utils [2015.20160320-1] [...].
Джонатан Ю.

@JonathanY. Ви також вибрали б не встановлені пакети. У будь-якому випадку, ви можете, будь-ласка, задати НОВЕ запитання та трохи детальніше розібратися, у чому полягає ваша ситуація. Я був би радий на це дивитись :)
gertvdijk

Я не задаю нового питання. Я вказую на можливу зміну, оскільки ця відповідь була зроблена, що робить деякі деталі невірними. Начебто, здавалося б, що apt-get remove packa*він дійсно сприймає глобус, packa*а не дивиться на це як на регулярний вираз: він відповідає, packageале ні pack.
Джонатан Ю.

110

Для Ubuntu 12.04 і, можливо, вище, правильний метод:

sudo apt-get --purge autoremove packagename

Як детально тут .

Не використовуйте, packagename*оскільки це може видалити ненавмисні пакети та спричинити більше проблем, ніж це вирішує. Або , якщо ви повинні, по крайней мере , запустити його з -s, --simulate, --dry-runпрапор першим , щоб побачити саме те , що він буде робити , не робити цього.


13
це правильна відповідь, коротка та лаконічна:
Anwar

20

Ви можете використовувати цю команду:

sudo apt-get purge --auto-remove packagename

Він очистить необхідні пакети разом із залежностями, які встановлені разом із цими пакетами. --auto-removeВаріант (будучи псевдонім autoremove) працює аналогічно sudo apt-get autoremove. За допомогою цієї команди ми можемо запустити одну команду:

sudo apt-get purge --auto-remove packagename

Замість:

sudo apt-get purge packagename
sudo apt-get autoremove

2
Хоча ти прав, але можна також скористатися sudo apt-get --purge autoremove packagename. Тут же 1 команда
Анвар

Чи може повну команду також записати як apt-get autoremove --purgeзамість apt-get purge --auto-remove?
felwithe

3
Може хтось, будь ласка, розстрілює мене?
Мартін Андерссон

7

Ви можете сміливо використовувати sudo apt-get remove --purge applicationабо sudo apt-get remove applications99% часу. Коли ви використовуєте purgeпрапор, він також просто видаляє всі конфігураційні файли. Що може бути, а може і не бути тим, що ви хочете, залежно від того, чи хочете ви перевстановити вказану програму. Збіг application*буде відповідати всім програмам, які починаються application, як правило, плагіни, додаткові функції тощо основного додатка, який ви видаляєте. тобто

sudo apt-get remove gedit*

видалить gedit, gedit-pluginsі gedit-common. Зазвичай цього робити не обов’язково, оскільки більшість плагінів / пов’язаних програм залежать від основного додатка, і вони автоматично видаляються (або позначаються для видалення) при видаленні основної програми.

Ваша остання команда - просто видалити залишки з програм, які, як відомо, мають безладні деінсталятори, і це просто видалення залишків програми.


5

Я отримав кілька повідомлень про помилки при видаленні пакета, і єдиний спосіб, який я виявив, що працював, це:

mv /var/lib/dpkg/info/package.* /tmp/
dpkg --remove --force-remove-reinstreq package

Я виявив, що хоча і використовує лише

dpkg --remove --force-remove-reinstreq package

не видаляє пакунок, він показує мені правильний шлях до файлу, з яким потрібно переміщатися:

mv /var/lib/dpkg/info/package.* /tmp/

Замініть пакет із назвою програми. Використовуйте sudo в Ubuntu, станьте root в Debian.



1

Це залежить від програми, яку ви хочете видалити. Завжди обов'язково перевіряйте її залежності перед тим, як видавати команду так. Коли ви видалите щось за допомогою командного рядка, іноді на ньому з’являться кілька бібліотек, які вже не потрібні. Їх можна видалити за допомогою apt-get autoremove.

Не забудьте, що за допомогою таких команд, як sudo apt-get remove --purgenamename може усунути деякі залежності, необхідні іншим програмам, і, як така, може порушити вашу систему.

Якщо ви хочете зробити це більш безпечним способом, ви завжди можете його видалити, використовуючи лише програмний центр або apt-get delete ім'я програми. Якщо залежності більше не потрібні, видайте apt-get autoremove пізніше.


Я думаю, вся система пакунків Debian була розроблена спеціально для того, щоб не видаляти пакет, якщо від нього залежать інші пакети. Вас можуть (корисно) запитати, чи хочете ви також видалити всі залежні пакунки, і саме там ви насправді повинні прочитати список пакунків, які збираються видалити, - це я думаю, що ви намагаєтесь сказати.
Xen2050

1

Я просто хотів уточнити одну річ, яка, здається, є джерелом плутанини тут. dpkgУтиліта не знає або відстежувати пакети залежностей по відношенню один до одного, який був великий причиною того, що aptбула розроблена я вважаю. Про це ви можете прочитати в розділі 8.6 на цій сторінці . Поширені запитання щодо Debian GNU / Linux - Засоби управління пакетами Debian

  • З apt: Якщо я хотів очистити пакет A, і він має залежність, яку називають пакет B, а пакет B не мав інших залежних пакетів, тоді пакет A і B буде очищений. Якщо пакет B DID має інші залежні пакети, то буде видалено лише пакет A.

  • З dpkg: яка залежність? Ти щойно сказав мені очистити проклятий
    пакет, щоб я це зробив! Погане планування з вашого боку не
    є надзвичайною ситуацією з мого боку.

З урахуванням сказаного, ось два одноводкові вкладиші, які можна використовувати для кожного методу очищення:

dpkg --list |grep "^rc" | cut -d " " -f 3 | xargs sudo dpkg --dry-run --purge

apt-get autoremove -y; apt-get --dry-run purge -y $(dpkg --list |grep '^rc' |awk '{print $2}')

Видаліть, --dry-runщоб виконати фактичну операцію очищення, а не повідомляти про те, які дії він би вчинив.

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