162

I'm newbiew with snap usage, I have few apps installed on my system, something that I notice when run the command df -h I found mounted different versions of the same snap

/dev/loop0       143M   143M     0 100% /var/lib/snapd/snap/gravit-designer/7
/dev/loop1        82M    82M     0 100% /var/lib/snapd/snap/core/4110
/dev/loop7       198M   198M     0 100% /var/lib/snapd/snap/polarr/3
/dev/loop2        82M    82M     0 100% /var/lib/snapd/snap/core/4206
/dev/loop3       143M   143M     0 100% /var/lib/snapd/snap/gravit-designer/6
/dev/loop10      137M   137M     0 100% /var/lib/snapd/snap/gravit-designer/5

my question is why they keep there, the only way I found to remove the old is remove and install again the snap, there's something like prune to maintain my system?

1

5 Answers 5

185

Here's a short script which will remove all old versions of snaps. This will only keep the current active version, which should recover you some disk space:

#!/bin/bash
# Removes old revisions of snaps
# CLOSE ALL SNAPS BEFORE RUNNING THIS
set -eu

LANG=C snap list --all | awk '/disabled/{print $1, $3}' |
    while read snapname revision; do
        snap remove "$snapname" --revision="$revision"
    done

The "Close snaps" is there because you may not have restarted an application before you updated. So it's possible you're actually running a revision which is to be removed by the script.

7
  • 2
    It successfully removed all old versions, but no space is added to my disk!
    – mtoloo
    Jul 25, 2018 at 15:15
  • 1
    Check dir /var/lib/snapd/snaps/ before and after running this script. Should have free up some space - if really removed some snaps. It should show messages like snap-name removed, eg gtk-common-themes removed.
    – PeterM
    Sep 24, 2018 at 18:30
  • 3
    There are some hardlinks in /var/lib/snapd/cache so you must delete those too to free up space. You can safely remove the cache with sudo rm /var/lib/snapd/cache/*
    – rubo77
    Jun 4, 2019 at 2:00
  • Had to update awk print to $1 and $2 to work properly because $3 is Tracking at my end not Rev maybe because Version column is empty for some reason Apr 24, 2021 at 23:39
  • 1
    strangely some snaps are not removed this way: gnome-3-28-1804 gnome-3-34-1804 gnome-3-38-2004
    – rubo77
    Nov 1, 2022 at 9:01
90

A version of the script from another answer, as a one-liner, without the awk dependency:

# snap list --all | while read snapname ver rev trk pub notes; do if [[ $notes = *disabled* ]]; then snap remove "$snapname" --revision="$rev"; fi; done

This likely requires bash or a compatible shell with the [[ construct.

8
  • 7
    This should be run from a user that can add snaps. On Ubuntu Core, the admin user works, on normal Ubuntu, a sudo -i session might be needed, or the snap remove might need to be run with sudo. Feb 4, 2019 at 17:06
  • 1
    @rubo77 pointed out that it does assume an English locale. Running it in a sub-shell (to not mess with the main shell's locale env variables) after doing export LC_ALL=en_US.UTF-8 beforehand should assure that. (It can also be set before the snap command, but I'm not sure if the removes later on might need to be translated as well) Jun 4, 2019 at 7:03
  • Just add LANG=c before the whole line works fine on German consoles
    – rubo77
    Jun 4, 2019 at 11:26
  • 3
    @anon58192932 The # prompt indicates that that the commands should be run from a root shell. (It is a common convention and also what \$ in the prompt variables will give) Also see the first comment. Jul 6, 2020 at 7:26
  • 1
    Yes, the --al output IS LOCALIZED , but if you know what is word for "disabled" in your language, you can just replace it in the command :) you can find out by just snap list --all
    – jave.web
    Mar 13, 2021 at 10:52
89

Starting from snap v2.34 and later, you can set the maximum number of snap revisions stored for each package by setting the refresh.retain option—it can only be a number between 2 and 20 and has a default value of 3.

sudo snap set system refresh.retain=2 
4
  • 5
    after doing this, moving from the default 3 to a new setting of 2, when are the current versions purged? Nov 14, 2018 at 23:36
  • 1
    I think the old snaps will be purged when new version installed. As you may already know, snap updates installed apps automatically depending on refresh.timer option, so you don't have to do the update manually Nov 15, 2018 at 6:12
  • But how to check how many my computer need? Example: refresh.retain=3 is good for 4Gb RAM or need more? Aug 9, 2019 at 20:46
  • 5
    @PeterKrauss It depends on your storage device capacity. It has nothing to do with your RAM capacity whatsoever. Aug 10, 2019 at 11:56
39

The snapd docs on versions state that the outdated revisions should be automatically removed so that no more than the last two revisions are installed. However, I also saw more than two versions of my snaps installed.

You can list all the revisions with snap list --all to see something like:

Name     Version                  Rev   Tracking  Developer  Notes
core     16-2.31.2                4206  stable    canonical  core,disabled
core     16-2.32.3                4407  stable    canonical  core,disabled
core     16-2.32.5                4486  stable    canonical  core
spotify  1.0.70.399.g5ffabd56-26  5     stable    spotify    disabled
spotify  1.0.72.117.g6bd7cc73-35  6     stable    spotify    disabled
spotify  1.0.77.338.g758ebd78-41  13    stable    spotify    -

You can remove individual revisions with snap remove spotify --revision=5.

This is safe even for the disabled revisions of core and other dependencies, and snap remove with an explicit --revision=... even prevents you from removing non-disabled snaps.

1
  • uh last two revisions meaning two plus the current one which is 3 revisions
    – Fuseteam
    May 28, 2021 at 13:04
2

The code @popey shared in their answer actually fails sometimes as some broken packages don't have the version info. So I modified the code to overcome this.

#!/bin/bash
# Removes old revisions of snaps
# CLOSE ALL SNAPS BEFORE RUNNING THIS
set -eu

snapsToRemove=$(LANG=en_US.UTF-8 snap list --all | awk '/disabled/{print $1, $2, $3}')

while read snapname version revision; do
    if [[ "$revision" == *[a-zA-z]* ]]; then
        # Version field is empty. Revision is in second field
        revision=$version
    fi
        snap remove "$snapname" --revision="$revision"
done <<< $snapsToRemove

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

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