如何使用一行命令删除已禁用(未使用)的Snap软件包?

当我运行snap list --all命令时,它会显示所有已安装的snap软件包的版本。
Name                  Version       Rev   Tracking  Developer     Notes
atom                  1.26.1        150   stable    snapcrafters  classic
brave                 v0.22.669dev  23    stable    brave         -
core                  16-2.32.6     4571  stable    canonical     core
core                  16-2.32.5     4486  stable    canonical     core,disabled
firefox               59.0.2-1      71    stable    mozilla       disabled
firefox               60.0-2        85    stable    mozilla       -
gimp                  2.10.0        38    stable    snapcrafters  disabled
gimp                  2.10.0        39    stable    snapcrafters  -
gimp                  2.8.22        30    stable    snapcrafters  disabled
gnome-3-26-1604       3.26.0        64    stable/…  canonical     -
gnome-3-26-1604       3.26.0        62    stable/…  canonical     disabled
gnome-characters      3.28.0        86    stable/…  canonical     -
gnome-characters      3.26.2        69    stable/…  canonical     disabled
gnome-logs            3.26.2        25    stable/…  canonical     disabled
gnome-logs            3.28.0        31    stable/…  canonical     -
gnome-system-monitor  3.26.0        36    stable/…  canonical     disabled
gnome-system-monitor  3.26.0        39    stable/…  canonical     -
libreoffice           6.0.3.2       59    stable    canonical     disabled
libreoffice           6.0.4.2       63    stable    canonical     -

现在有很多不再使用的残疾软件包。所以我想要删除这些软件包。命令是。现在我必须逐个为所有版本和所有软件包执行此操作。是否有一条命令可以一次性删除禁用或未使用的snap软件包?
提前感谢...

1是的,当然可以!我已经编辑了问题... - Ryko
1请注意,保留单个先前版本是按设计:当一个 snap 被更新时,较旧的修订版将被移除。 - muru
但是这里的GIMP有三个版本(修订版-30、38、39)。虽然修订版38和39具有相同的版本...如果这些应用程序中的任何一个获得进一步的更新,我会在稍后通知您... - Ryko
1Snap中是否有可用的设置,以便我可以禁用保留snap应用程序的先前版本...因为其中一些需要很多空间...比如LibreOffice占用近2GB的空间,如果包括先前版本,则变成4GB。 - Ryko
1目前这个问题正在由一个 snapd 开发者处理:https://github.com/snapcore/snapd/pull/5207 - Zygmunt Krynicki
这项工作,允许将默认的修订次数降低到每次快照2次,似乎已经合并了。有没有希望将其纳入 Bionic 18.04 LTS? - nealmcb
旧的快照会自动删除,以保留最多三个。@popey 提到的讨论是关于使数字可配置化的问题。 这个工作,允许将默认修订数降低到每个快照2个(但不能再低),现在似乎已经合并了:https://github.com/snapcore/snapd/pull/5207 有希望将其回溯到 Bionic 18.04 LTS 吗?允许每个快照的保存修订数可配置化也对那些庞大的包非常有益。 - nealmcb
9个回答

我会尽快研究并添加这个功能(作为一个20%的事情)。与此同时,你可以放下。
#!/bin/sh
set -eu

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

将其转换为一个shell脚本并运行。

我会在snap命令前加上sudo - Pierre François
11不,不要这样做:sudo应该由调用者明确执行。 - Chipaca
此外,对于snap remove命令来说,并不一定需要使用sudo(如果你已经进行了snap login)。 - Chipaca
3你可以使用 xargs 将其变成一行代码 :) - Ctrl-C
@Ctrl-C 我说就去做吧 - Chipaca
1为了真正释放空间,您可以安全地删除缓存,使用命令sudo rm /var/lib/snapd/cache/* - rubo77
必须将awk部分更改为awk '/disabled/{print $1, $2}',这样我才能正常工作。使用$3会输出Tracking列。 - Ju Tutt
如果您使用的是英语以外的其他语言,请将“disabled”替换为您所使用语言中的等效词汇。对于我来说,法语中的等效词汇是“désactivé”。 - bcag2
1@bcag2 LANG=C 部分将临时切换语言为英语,因此您无需触及代码。我刚试过捷克语。 - jena
@jena 你说得对...至少对于Jammy (22.04)来说是这样,也许我在Bionic或Focal (20.04)下遇到了这个问题。 - bcag2
@bcag2 实际上,我提到的那部分内容是在你的评论之后5个月才被编辑进答案中的 - 这就解释了一切 ;) 顺便说一下,这个技巧在我遇到的所有发行版上都有效,可能是标准的。 - jena
为什么需要 LANG=C - mario

我发现在别名(使用单引号)上更加优雅和易于使用的解决方案this solution
LANG=C snap list --all | while read snapname ver rev trk pub notes; do if [[ $notes = *disabled* ]]; then sudo snap remove "$snapname" --revision="$rev"; fi; done

从2.34版本开始,您可以通过设置refresh.retain选项(source)来设置系统存储的快照修订版本的最大数量。
sudo snap set system refresh.retain=2

你还可以通过清除快照缓存来释放一些空间:
sudo du -sh /var/lib/snapd/cache/                  # Get used space
sudo find /var/lib/snapd/cache/ -exec rm -v {} \;  # Remove cache

相关: 彻底删除Snap并安装Flatpak


з”ұдәҺжӯЈеёёз”ЁжҲ·ж— жі•иҜ»еҸ–/var/lib/snapd/cache/пјҢеӣ жӯӨжҳҹеҸ·дёҚдјҡеұ•ејҖеҲ°ж–Ү件гҖӮеӣ жӯӨпјҢжҲ‘йҰ–е…ҲдҪҝз”Ёsudo suе‘Ҫд»ӨпјҢ然еҗҺжү§иЎҢrm --force /var/lib/snapd/cache/*гҖӮ - Edvard Rejthar

在之前的回答基础上,你应该做类似以下的事情:
LANG=C snap list --all | awk '/disabled/{print $1" --revision "$3}' | xargs -rn3 snap remove


避免在没有禁用的快照修订时发出错误,并且专门在备注栏中寻找“禁用”一词。

哦哈,根据你对我的回答的评论,我修改了它,但是刚刚发现你也添加了一个基本相同的答案 :) - casper.dcl
7很不幸,在我的snap版本(Ubuntu 18.10上的2.38+18.10)中,Notes列是$6而不是$5snap list命令真的需要一个--format选项,以便输出在脚本中保持一致。 - Mike Hicks
@MikeHicks 你可以在这里提交错误报告 - Pablo Bianchi
为什么需要使用 LANG=C - mario

在看到Mike的笔记提到这些脚本因为输出列数改变而在版本之间出现问题后,我开始寻找是否有任何机器可读的绑定来处理这个问题。
我发现了snapd的REST API
相当于snap list --all的是:
curl --silent --show-error \
    --get --data select=all \
    --unix-socket /run/snapd.socket \
    http://localhost/v2/snaps

它返回JSON。要将其筛选为非活动软件包并将其转换为snap remove命令的列表,您可以使用jq
jq --raw-output '
    .result[] | 
    select(.status != "active") | 
    "snap remove --revision=\(.revision|@sh) \(.name|@sh)"
'

你理论上可以将所有内容放在一行中运行(我插入的换行是为了可读性),但这实在是太多了,所以我将其包装在一个脚本中:remove-disabled-snaps.sh

JSON格式做得很棒! - Binar Web

能够清除/移除旧的/禁用的快照的功能之前已经讨论过,但尚未实施。不幸的是,在此期间这仍然是一个手动的过程。

1有没有办法获取关于Snaps的机器可读信息(如JSON或类似格式),以便轻松解析并自动化处理? - muru
1看起来讨论实际上指出旧的快照会自动删除,以便最多只保留三个。讨论是关于使数量可配置化的。 - nealmcb

只是列表中的另一个选项,使用“parallel”。
snap list --all | awk '/disabled/{printf "snap remove %s --revision=%i \n",$1,$3}' | parallel

删除了系统中所有的禁用快照
core18 (revision 1705) removed
code (revision 33) removed
core (revision 9066) removed
gnome-3-34-1804 (revision 33) removed
powershell (revision 131) removed
snap-store (revision 433) removed
snapd (revision 7264) removed
rpi-imager (revision 28) removed

在 @Chipaca、@Ctrl-C 和 @Pablo Lalloni 的建议基础上:
snap list --all | awk '$5~"disabled"{print $1" --revision "$3}' | xargs -rn3 snap remove

这将在“注释”列中搜索“disabled”,并运行相应的快照的snap list --allsnap remove <snap> --revision <rev>


我不明白。 - Pierre.Vriens
你可以使用xargs的-r选项来避免错误。 - Pablo Lalloni
问题是该命令可能会删除名称中带有"disabled"的快照...不太可能,但是... - Pablo Lalloni

我刚刚做了以下操作:
  • 列出所有未使用/禁用的Snap软件包:

    sudo snap list | grep disabled

  • 将输出复制并粘贴到电子表格中

通常,输出是在一列中。只需进行“查找和替换”,反复将双空格替换为单空格,直到只剩下单个空格。

  • 使用单个空格作为分隔符,将您的列拆分为多个列。每个电子表格都有这样的工具。在LibreOffice中,它是数据 -> 文本到列。

  • 删除您不再需要的列。

  • 添加一些包含sudo snap remove--revision的列

My ready-to-use commands, in my spreadsheet

只需将您的内容复制并粘贴回控制台即可。

一个电子表格?真的吗? - harmv

基于@casper.dcl的回答,因为我正在运行Ubuntu 20.04。
snap list --all | awk '$6~"disabled"{print $1" --revision "$3}'

构建正确的列表以传递给xargs
$ ddf -m
Filesystem                 Type 1M-blocks  Used Available Use% Mounted on
/dev/mapper/vgubuntu-root  ext4     29170 26363      1358  96% /

$ snap list --all | awk '$6~"disabled"{print $1" --revision "$3}'
chromium --revision 2465
core18 --revision 2745
core20 --revision 1879
cups --revision 836
gnome-3-28-1804 --revision 194
gnome-3-34-1804 --revision 90
gnome-3-38-2004 --revision 137
gtk-common-themes --revision 1534
snap-store --revision 638
snapd --revision 19122

# finally the actual command

$ snap list --all | awk '$6~"disabled"{print $1" --revision "$3}' | sudo xargs -rn3 snap remove
chromium (revision 2465) removed
core18 (revision 2745) removed
core20 (revision 1879) removed
cups (revision 836) removed
gnome-3-28-1804 (revision 194) removed
gnome-3-34-1804 (revision 90) removed
gnome-3-38-2004 (revision 137) removed
gtk-common-themes (revision 1534) removed
snap-store (revision 638) removed
snapd (revision 19122) removed

$ ddf -m
Filesystem                 Type 1M-blocks  Used Available Use% Mounted on
/dev/mapper/vgubuntu-root  ext4     29170 25174      2547  91% /

1.2G 已经恢复。