Come rimuovere i pacchetti di snap disabilitati (non utilizzati) con una singola riga di comando?


18

Quando eseguo il snap list --allcomando mostra tutte le versioni installate dei pacchetti di 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     -

Ora ci sono così tanti pacchetti disabilitati lì che non vengono più utilizzati. Quindi voglio rimuovere quei pacchetti. Qui è il comando snap remove gnome-3-26-1604 --revision=62. Ora devo farlo per tutte le revisioni e per tutti i pacchetti uno per uno. Esiste un comando che rimuoverà i pacchetti di snap disabilitati o inutilizzati con una singola riga di comando?

Grazie in anticipo...


1
Si certo!! Ho modificato la domanda ...
Ryko

Tenere presente che mantenere una singola versione precedente è in base alla progettazione : quando uno snap viene aggiornato, la revisione precedente verrà rimossa.
muru,

Ma qui gimp ha 3 versioni (revisione-30,38,39). Sebbene le versioni 38 e 39 abbiano le stesse versioni ... Ti informerò in seguito quando una di queste app riceverà ulteriori aggiornamenti ...
Ryko,

C'è qualche impostazione disponibile in uno snap in modo da poter disabilitare il mantenimento delle versioni precedenti delle applicazioni di snap ... Perché alcune di esse richiedono così tanto spazio ... come libre-office occupa quasi 2 GB di spazio, e se la versione precedente è incluso diventa 4GB.
Ryko,

Questo è stato elaborato da uno sviluppatore snapd ora: github.com/snapcore/snapd/pull/5207
Zygmunt Krynicki

Risposte:


21

Prenderò in considerazione l'aggiunta di questo presto (come una cosa del 20%). Nel frattempo, potresti cadere

#!/bin/sh
set -eu

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

in uno script di shell ed eseguirlo.


Anticiperei un sudo ai comandi snap .
Pierre François,

1
no, non farlo: sudo dovrebbe essere fatto esplicitamente dal chiamante.
Chipaca

inoltre, non hai necessariamente bisogno di sudo per snap remove(se hai fatto un snap login)
Chipaca

1
Puoi usarlo xargsper renderlo un vero e proprio :) :)
Ctrl-C

@ Ctrl-C, dico di
provarci

4

Ho trovato più elegante e facile da usare su un alias (usando virgolette singole) questa soluzione :

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

A partire dallo snap 2.34 e versioni successive, è possibile impostare il numero massimo di revisioni di uno snap memorizzato dal sistema impostando refresh.retainun'opzione ( sorgente ).

sudo snap set system refresh.retain=2 

2

La capacità di eliminare / rimuovere gli snap vecchi / disabilitati è stata discussa in precedenza ma non ancora implementata. Nel frattempo purtroppo è un processo manuale.


1
Esiste un modo per ottenere informazioni leggibili automaticamente sugli snap (JSON o simili) che possono essere facilmente analizzate per automatizzare questo?
muru,

1
Sembra che la discussione in realtà noti che i vecchi snap vengono rimossi automaticamente, quindi ci sono un massimo di tre. La discussione riguarda la configurazione del numero.
nealmcb,

1

Basandoti sulle risposte precedenti, probabilmente dovresti fare qualcosa del tipo:

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

Ciò evita di emettere un errore in assenza di una revisione dello snap disabilitata e cerca "disabilitato" specificatamente nella colonna delle note.


oh ah ho modificato la mia risposta in base ai tuoi commenti, ma ho appena visto che hai aggiunto una risposta sostanzialmente identica :)
casper.dcl

4
Sfortunatamente nella mia versione di snap (2.38 + 18.10 su Ubuntu 18.10), la colonna Note è $6piuttosto che $5. Il snap listcomando ha davvero bisogno di --formatun'opzione in modo che l'output possa essere coerente per gli script.
Mike Hicks,

@MikeHicks È possibile archiviare il bug qui
Pablo Bianchi

0

Basandoci sui suggerimenti di @Chipaca, @ Ctrl-C e @Pablo Lalloni:

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

Questo cerca "disabilitato" nella colonna "Note" di snap list --alled esegue snap remove <snap> --revision <rev>lo snap corrispondente.


Non capisco
Pierre.Vriens,

Puoi evitare l'errore usando il flag -r di xarg.
Pablo Lalloni,

Il problema è che il comando potrebbe rimuovere gli snap con "disabilitato" nel suo nome ... improbabile ma ...
Pablo Lalloni

0

Dopo aver visto la nota di Mike su questi script che si interrompevano tra le versioni perché il numero di colonne di output è cambiato, sono andato a vedere se ci sono vincoli leggibili automaticamente su questa roba.

Quello che ho trovato era l'API REST di snapd .

L'equivalente di snap list --allè

curl --silent --show-error \
    --get --data select=all \
    --unix-socket /run/snapd.socket \
    http://localhost/v2/snaps

Restituisce JSON. Per filtrarlo in pacchetti non attivi e trasformarlo in un elenco di snap removecomandi, è possibile utilizzare jq:

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

Tecnicamente potresti eseguire tutto ciò su una sola riga (le interruzioni che ho inserito sono per leggibilità), ma è piuttosto una manciata, quindi l'ho avvolto in uno script: remove-disabled-snaps.sh

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.