Comment supprimer des packages d'instantanés désactivés (inutilisés) avec une seule ligne de commande?

18

Lorsque j'exécute la snap list --allcommande, elle affiche toutes les versions installées des packages d'instantanés.

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     -

Maintenant, il y a tellement de packages désactivés qui ne sont plus utilisés. Je souhaite donc supprimer ces packages. Voici la commande snap remove gnome-3-26-1604 --revision=62. Maintenant, je dois le faire pour toutes les révisions et pour tous les packages un par un. Existe-t-il une commande qui supprimera les packages d'instantanés désactivés ou inutilisés avec une seule ligne de commande?

Merci d'avance...

Ryko
la source
1
Oui bien sûr!! J'ai édité la question ...
Ryko
Notez que conserver une seule version précédente est de par leur conception : lorsqu'un snap est mis à jour, l'ancienne révision sera supprimée.
muru
Mais ici, gimp a 3 versions (révision-30,38,39). Bien que les révisions 38 et 39 aient les mêmes versions ... Je vous informerai plus tard lorsque l'une de ces applications recevra de nouvelles mises à jour ...
Ryko
Y a-t-il des paramètres disponibles dans snap pour que je puisse désactiver la conservation des versions précédentes des applications snap ... Parce que certaines d'entre elles nécessitent tellement d'espace ... comme libre-office prend près de 2 Go d'espace, et si la version précédente est inclus, il devient 4 Go.
Ryko
Ceci est en cours d'élaboration par un développeur snapd maintenant: github.com/snapcore/snapd/pull/5207
Zygmunt Krynicki

Réponses:

21

Je vais envisager d'ajouter cela très bientôt (comme une chose de 20%). Pendant ce temps, vous pourriez laisser tomber

#!/bin/sh
set -eu

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

dans un script shell et l'exécuter.

Chipaca
la source
Je voudrais ajouter un sudo aux commandes snap .
Pierre François
1
non, ne faites pas ça: sudo devrait être fait par l'appelant, explicitement.
Chipaca
de plus, vous n'avez pas nécessairement besoin de sudo pour snap remove(si vous en avez fait un snap login)
Chipaca
1
Vous pouvez l'utiliser xargspour en faire un oneliner :)
Ctrl-C
@ Ctrl-C je dis allez-y
Chipaca
4

J'ai trouvé plus élégante et facile à utiliser sur un alias (en utilisant des guillemets simples) cette 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

À partir de snap 2.34 et versions ultérieures, vous pouvez définir le nombre maximal de révisions d'un snap stockées par le système en définissant une refresh.retainoption ( source ).

sudo snap set system refresh.retain=2 
Pablo Bianchi
la source
2

La possibilité de purger / supprimer les snaps anciens / désactivés a été discutée précédemment mais pas encore implémentée. En attendant, malheureusement, c'est un processus manuel.

popey
la source
1
Existe-t-il de toute façon des informations lisibles par machine sur les snaps (JSON ou similaires) qui peuvent être facilement analysées pour automatiser cela?
muru
1
Il semble que la discussion note que les anciens snaps sont automatiquement supprimés, de sorte qu'il y en a au maximum trois. La discussion consiste à rendre le nombre configurable.
nealmcb
1

Sur la base des réponses précédentes, vous devriez probablement faire quelque chose comme:

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

Ce qui évite d'émettre une erreur lorsqu'il n'y a pas de révision d'accrochage désactivée et recherche «désactivé» spécifiquement dans la colonne des notes.

Pablo Lalloni
la source
oh hah j'ai édité ma réponse en fonction de vos commentaires à ce sujet, mais je viens de voir que vous avez ajouté une réponse fondamentalement identique :)
casper.dcl
4
Malheureusement dans ma version de snap (2.38 + 18.10 sur Ubuntu 18.10), la colonne Notes est $6plutôt que $5. La snap listcommande a vraiment besoin d'une --formatoption pour que la sortie puisse être cohérente pour les scripts.
Mike Hicks
@MikeHicks Vous pouvez déposer le bogue ici
Pablo Bianchi
0

S'appuyant sur les suggestions de @Chipaca, @ Ctrl-C et @Pablo Lalloni:

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

Cela recherche "désactivé" dans la colonne "Notes" snap list --allet exécute snap remove <snap> --revision <rev>le snap correspondant.

casper.dcl
la source
Je ne comprends pas
Pierre.Vriens
Vous pouvez éviter l'erreur en utilisant l'indicateur -r de xarg.
Pablo Lalloni
Le problème est que la commande pourrait supprimer les snaps avec "désactivé" dans son nom ... peu probable mais ...
Pablo Lalloni
0

Après avoir vu la note de Mike à propos de la rupture de ces scripts entre les versions car le nombre de colonnes de sortie a changé, je suis allé voir s'il y avait des liaisons lisibles par machine à ce genre de choses.

Ce que j'ai trouvé était l'API REST de snapd .

L'équivalent de snap list --allest

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

Il renvoie JSON. Pour le filtrer vers les packages non actifs et le transformer en une liste de snap removecommandes, vous pouvez utiliser jq:

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

Techniquement, vous pourriez exécuter tout cela sur une seule ligne (les sauts que j'ai insérés sont pour la lisibilité), mais c'est une poignée, alors je l'ai enveloppé dans un script: remove-disabled-snaps.sh

keturn
la source