¿Cómo eliminar los paquetes snap deshabilitados (no utilizados) con una sola línea de comando?

18

Cuando ejecuto el snap list --allcomando, muestra todas las versiones instaladas de paquetes 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     -

Ahora hay tantos paquetes deshabilitados que ya no se usan. Entonces quiero eliminar esos paquetes. Aquí está el comando snap remove gnome-3-26-1604 --revision=62. Ahora tengo que hacerlo para todas las revisiones y para todos los paquetes uno por uno. ¿Hay algún comando que elimine los paquetes snap deshabilitados o no utilizados con una sola línea de comando?

Gracias por adelantado...

Ryko
fuente
1
¡¡Si seguro!! He editado la pregunta ...
Ryko
Tenga en cuenta que mantener una única versión anterior es por diseño : cuando se actualiza un complemento, se eliminará la revisión anterior.
muru
Pero aquí gimp tiene 3 versiones (revisión-30,38,39). Aunque las revisiones 38 y 39 tienen las mismas versiones ... te informaré más tarde cuando cualquiera de estas aplicaciones reciba más actualizaciones ...
Ryko
¿Hay alguna configuración disponible en modo instantáneo para que pueda deshabilitar el mantenimiento de versiones anteriores de las aplicaciones instantáneas ...? Porque algunas de ellas requieren mucho espacio ... como libre-office ocupa casi 2 GB de espacio, y si la versión anterior es incluido se convierte en 4GB.
Ryko
Un desarrollador de Snapd está trabajando en esto ahora: github.com/snapcore/snapd/pull/5207
Zygmunt Krynicki

Respuestas:

21

Buscaré agregar esto pronto (como una cosa del 20%). Mientras tanto, podrías caer

#!/bin/sh
set -eu

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

en un script de shell y ejecutar eso.

Chipaca
fuente
Prepondría un sudo a los comandos de ajuste .
Pierre François
1
no, no hagas eso: sudo debe ser realizado por la persona que llama, explícitamente.
Chipaca
además, no necesariamente necesitas sudo para snap remove(si hiciste un snap login)
Chipaca
1
Puedes usarlo xargspara convertirlo en línea :)
Ctrl-C
@ Ctrl-C digo: adelante
Chipaca
4

Encontré más elegante y fácil de usar en un alias (usando comillas simples) esta solución :

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 partir del complemento 2.34 y posterior, puede establecer el número máximo de revisiones de un complemento almacenadas por el sistema configurando una refresh.retainopción ( fuente ).

sudo snap set system refresh.retain=2 
Pablo Bianchi
fuente
2

La capacidad de purgar / eliminar instantáneas antiguas / deshabilitadas se ha discutido anteriormente, pero aún no se ha implementado. Mientras tanto, desafortunadamente es un proceso manual.

papa
fuente
1
¿Hay alguna forma de obtener información legible por máquina sobre instantáneas (JSON o similar) que pueda analizarse fácilmente para automatizar esto?
muru
1
Parece que la discusión en realidad señala que las instantáneas antiguas se eliminan automáticamente, por lo que hay un máximo de tres. La discusión se trata de hacer que el número sea configurable.
nealmcb
1

Basándose en las respuestas anteriores, probablemente debería estar haciendo algo como:

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

Lo que evita emitir un error cuando no hay una revisión instantánea deshabilitada y busca "deshabilitado" específicamente en la columna de notas.

Pablo Lalloni
fuente
oh ja he editado mi respuesta sobre la base de sus comentarios sobre ella, pero acabo de ver que ha agregado una respuesta básicamente idéntica :)
casper.dcl
44
Desafortunadamente en mi versión de snap (2.38 + 18.10 en Ubuntu 18.10), la columna de Notas es $6más que $5. El snap listcomando realmente necesita una --formatopción para que la salida pueda ser coherente para las secuencias de comandos.
Mike Hicks
@MikeHicks Puedes archivar el error aquí
Pablo Bianchi
0

Sobre la base de las sugerencias de @Chipaca, @ Ctrl-C y @Pablo Lalloni:

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

Esto busca "deshabilitado" en la columna "Notas" snap list --ally ejecuta snap remove <snap> --revision <rev>el complemento correspondiente.

casper.dcl
fuente
No lo entiendo
Pierre.Vriens
Puede evitar el error usando el indicador -r de xarg.
Pablo Lalloni
El problema es que el comando podría eliminar instantáneas con "deshabilitado" en su nombre ... poco probable pero ...
Pablo Lalloni
0

Después de ver la nota de Mike sobre estas secuencias de comandos que se rompen entre las versiones porque el número de columnas de salida cambió, busqué para ver si hay enlaces legibles por máquina para estas cosas.

Lo que encontré fue la API REST de snapd .

El equivalente de snap list --alles

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

Devuelve JSON. Para filtrarlo a paquetes no activos y convertirlo en una lista de snap removecomandos, puede usar jq:

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

Técnicamente, podría ejecutar todo eso en una sola línea (los saltos que inserté son para facilitar la lectura), pero es bastante difícil, así que lo envolví en un script: remove-disabled-snaps.sh

keturn
fuente