如何删除已安装的旧版本 snap

如何删除已安装的旧版本 snap

我是 snap 的新手,我的系统上安装了一些应用程序,当我运行命令时我注意到df -h安装了同一个 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

我的问题是为什么它们会保留在那里,我发现删除旧内容的唯一方法是删除并再次安装快照。

有没有什么方法prune可以维护我的系统?

答案1

这是一个简短的脚本,它将删除全部旧版本的 snap。这将只保留当前活动版本,这应该会为您节省一些磁盘空间:

#!/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

之所以出现“关闭快照”,是因为您可能在更新之前没有重新启动应用程序。因此,您实际上可能正在运行要被脚本删除的修订版本。

答案2

一个版本的来自另一个答案的脚本,作为一行代码,没有awk依赖项:

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

这可能需要bash或与构造兼容的外壳[[

答案3

从 snap v2.34 及更高版本开始,你可以通过设置选项来设置每个包存储的最大 snap 修订数量refresh.retain——它只能是一个数字2 至 20 之间并且有一个默认值为 3

sudo snap set system refresh.retain=2 

答案4

代码@popey 分享了他们的回答实际上有时会失败,因为一些损坏的软件包没有版本信息。所以我修改了代码来解决这个问题。

#!/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

相关内容