How to purge previously only removed packages? [duplicate]
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.
I just found the following command which worked:
sudo apt-get purge $(dpkg -l | grep '^rc' | awk '{print $2}')
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, replace --dry-run
with -y
in the apt-get
command.
Relevant documentation:
man dpkg awk xargs apt-get
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 instdin
where a tabulation followed by adeinstall
string could be removed from the end of the line; this has the effect of printing only the lines containing a tabulation followed by adeinstall
string at the end of the line without the actual tabulation followed by thedeinstall
string at the end of the line -
xargs sudo apt-get --yes purge
: passes each line instdin
as an argument tosudo 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.