無効な(未使用の)スナップパッケージを1行のコマンドで削除する方法は?


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つずつ実行する必要があります。1行のコマンドで無効または未使用のスナップパッケージを削除するコマンドはありますか?

前もって感謝します...


1
確かに!! 私は質問を編集しました
...-Ryko

単一の以前のバージョンを保持することは設計によるものであることに注意してください。スナップが更新されると、古いリビジョンが削除されます。
ムル

しかし、ここではgimpには3つのバージョンがあります(revision-30,38,39)。リビジョン38と39には同じバージョンがありますが...このアプリのいずれかがさらに更新された場合、後でお知らせします
...-Ryko

以前のバージョンのスナップアプリケーションの保持を無効にできるように、スナップで使用できる設定はありますか?それらのいくつかは非常に多くのスペースを必要とするため...含まれる場合は4GBになります。
リコ

これは現在スナップされた開発者によって作業されています:github.com/snapcore/snapd/pull/5207
Zygmunt Krynicki

回答:


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

シェルスクリプトに入れて実行します。


スナップコマンドの前にsudo追加します。
ピエールフランソワ

1
いいえ、それをしないでください:sudoは呼び出し元によって明示的に行われるべきです。
チパカ

さらに、sudoは必ずしも必要ではありませんsnap remove(使用した場合snap login
Chipaca

1
を使用xargsしてワンライナーにすることができます:)
Ctrl-C

@ Ctrl-C私はそれのために行くと言う
チパカ

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など)についての機械可読情報を取得する方法はありますか?
ムール

1
議論では実際に古いスナップは自動的に削除されるため、最大3つあると述べているようです。議論は、番号を構成可能にすることです。
nealmcb

1

以前の回答に基づいて、おそらく次のようなことを行う必要があります。

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

これにより、無効なスナップリビジョンが存在せず、特にメモの列で「無効」を検索するときにエラーが発生することを回避できます。


ああ、私はあなたのコメントに基づいて答えを編集しましたが、基本的に同じ答えを追加したことがわかりました:)
casper.dcl

4
残念ながら、私のスナップバージョン(Ubuntu 18.10の2.38 + 18.10)では、Notes列は$6でなくになってい$5ます。このsnap listコマンド--formatには、スクリプト出力の一貫性を保つためのオプションが本当に必要です。
マイクヒックス


0

@ Chipaca、@ Ctrl-C、および@Pablo Lalloniの提案を基に作成:

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

これにより、[メモ]列​​で[無効]が検索されます。 snap list --allして実行しsnap remove <snap> --revision <rev>、対応するスナップの。


私はそれを取得しません
Pierre.Vriens

xargの-rフラグを使用してエラーを回避できます。
パブロラロニ

問題は、そのコマンドが... ...その名に「無効」思いも寄らないしかし、でスナップを取り除くことができている
パブロLalloni

0

出力列の数が変更されたためにバージョン間でこれらのスクリプトが壊れるというMikeからのメモを後、私はこの内容への機械可読なバインディングがあるかどうかを調べました。

私が見つけたのはsnapdのREST APIでしたです。

同等snap list --allIS

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.