我是 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