如何使用一行命令删除禁用(未使用)的 snap 包?

Ryk*_*yko 37 package-management 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     -
Run Code Online (Sandbox Code Playgroud)

现在有很多已禁用的软件包不再使用。所以我想删除那些包。这里的命令是snap remove gnome-3-26-1604 --revision=62. 现在我必须对所有的修订和所有的包一一进行。是否有任何命令可以使用单行命令删除禁用或未使用的 snap 包?

提前致谢...

Chi*_*aca 33

我很快就会考虑添加这个(作为 20% 的东西)。同时,你可以放下

#!/bin/sh
set -eu

snap list --all | awk '/disabled/{print $1, $3}' |
    while read snapname revision; do
        snap remove "$snapname" --revision="$revision"
    done
Run Code Online (Sandbox Code Playgroud)

进入一个shell脚本并运行它。

  • 不,不要那样做: sudo 应该由调用者明确地完成。 (4认同)
  • 您可以使用 `xargs` 使其成为 oneliner :) (3认同)

Pab*_*chi 14

我发现这个解决方案更优雅且易于使用别名(使用单引号):

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
Run Code Online (Sandbox Code Playgroud)

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

sudo snap set system refresh.retain=2
Run Code Online (Sandbox Code Playgroud)

您还可以通过删除 snap 的缓存来释放一些空间:

sudo snap set system refresh.retain=2
Run Code Online (Sandbox Code Playgroud)


小智 9

基于之前的答案,您可能应该这样做:

LANG=C snap list --all | awk '/disabled/{print $1" --revision "$3}' | xargs -rn3 snap remove

Run Code Online (Sandbox Code Playgroud)

这可以避免在没有禁用的快照修订时发出错误,并在注释列中专门查找“禁用”。

  • 不幸的是,在我的 snap 版本(Ubuntu 18.10 上为 2.38+18.10)中,注释列是“$6”而不是“$5”。“snap list”命令确实需要一个“--format”选项,以便输出可以与脚本保持一致。 (7认同)

ket*_*urn 5

在看到迈克关于这些脚本因输出列数发生变化而在版本之间中断的注释后,我去查看是否有任何机器可读的绑定到这些东西。

我发现的是snapd 的 REST API

等价snap list --all于是

curl --silent --show-error \
    --get --data select=all \
    --unix-socket /run/snapd.socket \
    http://localhost/v2/snaps
Run Code Online (Sandbox Code Playgroud)

它返回 JSON。要将其过滤为非活动包并将其转换为snap remove命令列表,您可以使用jq

jq --raw-output '
    .result[] | 
    select(.status != "active") | 
    "snap remove --revision=\(.revision|@sh) \(.name|@sh)"
'
Run Code Online (Sandbox Code Playgroud)

从技术上讲,您可以在一行上运行所有这些内容(我插入的中断是为了提高可读性),但它的数量相当多,所以我将其包装在一个脚本中:remove-disabled-snaps.sh