These were taken from this source.
My one-liner to remove old kernels (this also frees up disk space)
dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p' | xargs sudo apt-get -y purge
Explanation (remember, | uses the output of the previous command as the input to the next)
dpkg
–list lists all installed packagesgrep linux-image
looks for the installed linux imagesawk '{ print $2 }'
just outputs the 2nd column (which is the package name)sort -V
puts the items in order by version numbersed -n '/'`uname -r`'/q;p
prints the lines before the current kernelxargs sudo apt-get -y purge
purges the found kernels
Unwinding the sed invocation:
-n
tells sed to be quietuname -r
outputs the current installed kernel release - we include it in backticks so that the output is includes as part of the command (you might also see this as $(uname -r)/something/q
says stop when you match ‘something’ (in this case, something is output of uname -r) - the / surround a regular expressionp
is printthe
;
is the command separtor, so/something/q;p
says quit when you match something, else printaltogether,
sed -n '/'`uname -r`'/q;p'
is print the lines until it matches with the current kernel name.
If you’re paranoid (like me), you can make the last part xargs echo sudo apt-get -y purge so that the command to purge the old kernels is printed, then you can check that nothing unexpected is included before you run it.
Modified version to remove headers:
dpkg --list | grep 'linux-image' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge
dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge
Note: the sed invocation is modified.
$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")
extracts only the version (e.g. “3.2.0-44”) , without “-generic” or similar from uname -r
All-in-one version to remove images and headers (combines the two versions above):
echo $(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p') $(dpkg --list | grep linux-headers | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p') | xargs sudo apt-get -y purge