如何从缓存中删除已卸载的 Snaps?

当我使用“snap install ”安装一个快照时,它会被下载和挂载。当我使用“snap remove ”将其删除时,“所有东西”都会被删除,包括快照、用户设置依赖等等。但是,当我在删除后重新安装快照时,它没有下载时间,所以这个快照必须存储在某个地方。
如何清除snapd的缓存以及所有已卸载的快照?

它们存放在 /var/lib/snapd/cache 中,但并不是以快照名称命名。通过文件的属性,比如大小和创建日期,你可以做出一个合理的猜测。否则,当安装一个快照时你需要打开文件夹,观察所创建的文件,并将其名称或部分名称以及大小记录在其他地方,以备将来使用。 - doug
1@doug 是的,我注意到当重复安装和卸载一个快照时,某个文件的硬链接计数会发生变化。安装会在/var/lib/snapd/snaps中创建一个指向/var/lib/snapd/cache中的文件之一的硬链接,inode相同。当尝试重新安装时,从/var/lib/snapd/cache中删除该文件会导致重新下载。 - mook765
3个回答

你可以毫无问题地删除/var/lib/snapd/cache中的文件。而且在此之前没有必要停止snapd。

这个问题在Snapcraft论坛上得到了回答:

...

答案归结为:你不应该有很多硬链接计数为1的文件;默认安装最多只能有5个。如果超过这个数量,那就是一个bug,请告诉我们。

是的,你可以毫无问题地删除它们;不需要停止snapd。

以下是执行此操作的命令:

sudo sh -c 'rm -rf /var/lib/snapd/cache/*'

7我必须先完全进入sudo模式,使用sudo -i命令,只有这样才能正常工作。简单的sudo命令无效,并显示**"没有这样的文件或目录"**,尽管sudo ls /var/lib/snapd/cache/显示了文件...你可以使用logout退出完全的sudo模式 :) - jave.web
我也一样。这就是为什么我没有添加执行此操作的命令。那是别人做的。 - neun24
@neun24 修复了sudo的调用,希望你能批准 ;) - Tino
真正的修复现在已经应用。 - dolmen
3sudo find /var/lib/snapd/cache/ -exec rm -v {} \; - wesinat0r

请注意,Snap 不仅会保留已删除的 Snap,还会保留该 Snap 的多达 20 个旧版本(标准为 3 个版本)。因此,在清理这些剩余副本时,我获得了比清理缓存(5GB 对 1GB)更多的可用存储空间。这个网站有一个很好的脚本,我就是用它来进行清理。
#!/bin/bash
#Removes old revisions of snaps
#CLOSE ALL SNAPS BEFORE RUNNING THIS
set -eu
LANG=en_US.UTF-8 snap list --all | awk '/disabled/{print $1, $3}' |
    while read snapname revision; do
        snap remove "$snapname" --revision="$revision"
    done

你也可以简单地这样做:
sudo snap remove --purge $PACKAGE

4这将删除设置,当您从一个快照包迁移到本机包时并不实用。 - Mark Jeronimus
6无法用于未安装的软件包。 - jave.web