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


18

当我运行snap list --all命令时,它将显示快照包的所有已安装版本。

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 remove gnome-3-26-1604 --revision=62。现在,我必须对所有修订和所有软件包一一进行。是否有任何命令可以通过单行命令删除已禁用或未使用的管理程序包?

提前致谢...


1
当然可以!!我已经编辑了问题...
瑞科

请注意,按设计保留一个以前的版本:更新快照时,将删除较早的修订版。
muru

但是这里gimp有3个版本(修订版30、38、39)。尽管修订版38和39具有相同的版本...当任何一个此类应用程序得到进一步的更新时,我会稍后通知您
Ryko

快照中是否有任何可用设置,因此我可以禁用保留快照应用程序的先前版本...因为其中一些需要大量空间...像libre-office占用将近2GB的空间,并且如果先前版本是包括它成为4GB。
Ryko)

现在,这已由一个急速的开发人员进行处理:github.com/snapcore/snapd/pull/5207
Zygmunt Krynicki

Answers:


21

我很快就会考虑添加此内容(占20%)。同时,您可以放下

#!/bin/sh
set -eu

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

到一个shell脚本并运行它。


我会在前面加上一个须藤捕捉命令。
PierreFrançois19年

1
不,不要那样做:sudo应该由调用方明确地完成。
Chipaca

此外,您不一定需要sudo snap remove(如果您这样做的话snap login
Chipaca

1
您可以使用xargs它来使它成为一个衬垫:)
Ctrl-C

@ Ctrl-C我说去吧
Chipaca

4

我发现此解决方案在别名(使用单引号)上更优雅,更易于使用:

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 

2

清除/删除旧的/禁用的快照的功能先前已经讨论过,但尚未实现。同时,很遗憾,这是一个手动过程。


1
无论如何,是否有关于快照的机器可读信息(JSON或类似信息),可以轻松地对其进行解析以使其自动化?
muru

1
看起来讨论实际上注意到,旧的快照已自动删除,因此最多三个。讨论是关于使数字可配置的。
nealmcb

1

在先前的答案的基础上,您可能应该执行以下操作:

snap list --all | awk '$5~"disabled"{print $1" --revision "$3}' | xargs -rn3 snap remove

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


哦,我根据您对它的评论编辑了答案,但只是看到您添加了一个基本相同的答案:)
casper.dcl

4
不幸的是,在我的snap版本(在Ubuntu 18.10上为2.38 + 18.10)中,Notes列$6不是$5。该snap list命令确实需要一个--format选项,以便输出可以与脚本保持一致。
Mike Hicks


0

以@ Chipaca,@ Ctrl-C和@Pablo Lalloni的建议为基础:

snap list --all | awk '$5~"disabled"{print $1" --revision "$3}' | xargs -rn3 snap remove

snap list --allsnap remove <snap> --revision <rev>在相应快照的“注释”列中搜索“已禁用” 并运行相应的快照。


我不明白
Pierre.Vriens

您可以使用xarg的-r标志避免该错误。
Pablo Lalloni,

问题是该命令可能会删除名称中带有“ disabled”的快照...不太可能,但是...
Pablo Lalloni,

0

在看到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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.