This question already has an answer here:

I have a list of packages on my system, that were installed and removed again, but not purged, i.e. there are still a lot of conffiles etc. laying around.

The output of dpkg --get-selections | grep deinstall lists about 85 different packages which I don't need and want to be purged entirely.

So my short question, which I decided to finally ask after experimenting around has lead to this problem, is:

How do I completely purge previously installed packages that are already removed?

Reinstalling and then purging is not an option, of course.

marked as duplicate by Eliah Kagan, Community Jul 17 '17 at 16:24

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

  • "Reinstalling and then purging is not an option, of course." LoL ;) – TellMeWhy Oct 19 '15 at 12:45
  • @DevRobot I don't see the joke. It would be possible and pretty surely work, but don't have the time to download and install tons of packages just to get rid of them... – Byte Commander Oct 19 '15 at 12:47
  • I know - it's the of course - relates :) – TellMeWhy Oct 19 '15 at 12:51
  • I think you can do sudo apt-get purge [package] after you have removed them. I just tried it and it worked. – Jos Oct 19 '15 at 12:53
  • I often use aptitude for that -- pressing _ on the line Not installed packages will mark all of these packages for configuration file removal. Not an answer because aptitude is likely going away. – Simon Richter Oct 20 '15 at 2:18
up vote 23 down vote accepted

I just found the following command which worked:

sudo apt-get purge $(dpkg -l | grep '^rc' | awk '{print $2}')
  • Hmm, I suspect this will hit the command line argument length limit if you have 50000 uninstalled package. waltinator's solution below does not. Not that I see that ever happening. – Rolf Feb 3 at 11:40

dpkg --get-selections | grep deinstall produces a list of package names with the word "deinstall":

$ dpkg  --get-selections | grep deinstall
account-plugin-windows-live         deinstall
debarchiver                         deinstall
flashplugin-installer               deinstall
    ...

By asking awk to print only the first field we get:

$ dpkg --get-selections | awk '$2 == "deinstall" {print $1}'
account-plugin-windows-live
debarchiver
flashplugin-installer
    ...

Now that we have the list of packages, xargs will let us feed the list of packages to a command (or commands, if the list is long enough):

dpkg --get-selections | awk '$2 == "deinstall" {print $1}' | xargs sudo apt-get purge --dry-run

When you are happy with the simulated results, remove --dry-run from the apt-get command.

Read:

for i in awk xargs apt-get ; do
    man $i
done
  • 2
    Nice manpage campaign! :D – Byte Commander Oct 19 '15 at 13:03
  • 5
    On my system , Ubuntu 15.04, I had to add the -y option to apt-get to stop the command from aborting before the packages were removed. – ankh-morpork Oct 20 '15 at 1:24

If you just want to purge the whole list, you can use this command; it will perform a dry run, in case essential packages are going to be removed, which you probably don't want to happen:

dpkg --get-selections | sed -n 's/\tdeinstall$//p' | xargs sudo apt-get --dry-run purge

If no essential package is going to be removed, it's safe to run the actual command:

dpkg --get-selections | sed -n 's/\tdeinstall$//p' | xargs sudo apt-get --yes purge
  • sed -n 's/\tdeinstall$//p': prints only lines in stdin where a tabulation followed by a deinstall string could be removed from the end of the line; this has the effect of printing only the lines containing a tabulation followed by a deinstall string at the end of the line without the actual tabulation followed by the deinstall string at the end of the line
  • xargs sudo apt-get --yes purge: passes each line in stdin as an argument to sudo apt-get --yes purge

My fifty cents, a simple oneliner:

First test with

dpkg --get-selections | awk '$2=="deinstall" {system("sudo apt-get --dry-run purge "$1)}'

and bye bye

dpkg --get-selections | awk '$2=="deinstall" {system("sudo apt-get -y purge "$1)}'

Example

% dpkg --get-selections | grep deinstall
nginx-common                    deinstall

% dpkg --get-selections | awk '$2=="deinstall" {system("sudo apt-get -y purge "$1)}'

% dpkg --get-selections | grep deinstall
[no output]

I asked this myself a couple of days ago. Came up with

apt-get purge $(dpkg -l | awk 'BEGIN{ORS=" "} /^rc/{ print $2}')

The removed but not purged packages appear in the output of dpkg -l with rc at the beginning. awk picks out the second column aka the name of the package and prints them space-separated.

Not the answer you're looking for? Browse other questions tagged or ask your own question.