Como remover pacotes de snap desativados (não utilizados) com uma única linha de comando?


18

Quando executo o snap list --allcomando, ele mostra todas as versões instaladas dos pacotes de 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     -

Agora existem tantos pacotes desativados que não são mais usados. Então, eu quero remover esses pacotes. Aqui está o comando snap remove gnome-3-26-1604 --revision=62. Agora eu tenho que fazer isso por todas as revisões e por todos os pacotes, um por um. Existe algum comando que removerá os pacotes de snap desativados ou não utilizados com uma única linha de comando?

Desde já, obrigado...


1
Sim claro!! Eu editei a pergunta ...
Ryko 16/05

Observe que manter uma única versão anterior é por design : quando um snap é atualizado, a revisão mais antiga será removida.
muru 16/05

Mas aqui o gimp tem 3 versões (revisão-30,38,39). Embora a revisão 38 e 39 tem as mesmas versões ... vou informá-lo mais tarde, quando qualquer um desses aplicativos obter mais atualizações ...
Ryko

Existe alguma configuração disponível no snap para que eu possa desativar a manutenção de versões anteriores dos aplicativos de snap ... Como alguns deles exigem tanto espaço ... como o libre-office ocupa quase 2 GB de espaço e, se a versão anterior for incluído torna-se 4GB.
Ryko

Isso está sendo trabalhado por um desenvolvedor snapd agora: github.com/snapcore/snapd/pull/5207
Zygmunt Krynicki

Respostas:


21

Vou tentar adicionar isso em breve (como uma coisa de 20%). Enquanto isso, você pode largar

#!/bin/sh
set -eu

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

em um script de shell e execute isso.


Eu acrescentaria um sudo aos comandos snap .
Pierre François

1
não, não faça isso: sudo deve ser feito pelo chamador, explicitamente.
Chipaca 19/03/19

Além disso, você não precisa necessariamente sudo para snap remove(se você fez uma snap login)
Chipaca

1
Você pode usar xargspara torná-lo um oneliner :)
Ctrl-C

@ Ctrl-C eu digo vá em frente
Chipaca 23/03/19

4

Eu achei mais elegante e fácil de usar em um alias (usando aspas simples) esta solução :

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 do snap 2.34 e posterior, você pode definir o número máximo de revisões de um snap armazenadas pelo sistema, configurando uma refresh.retainopção ( origem ).

sudo snap set system refresh.retain=2 

2

A capacidade de limpar / remover snaps antigos / desativados foi discutida anteriormente, mas ainda não foi implementada. Enquanto isso, infelizmente, é um processo manual.


1
Existe alguma maneira de obter informações legíveis por máquina sobre snaps (JSON ou similares) que podem ser facilmente analisadas para automatizar isso?
25718 muru

1
Parece que a discussão realmente observa que os snaps antigos são removidos automaticamente, para que haja no máximo três. A discussão é sobre como tornar o número configurável.
Nealmcb 30/10

1

Com base nas respostas anteriores, você provavelmente deveria estar fazendo algo como:

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

O que evita emitir um erro quando não há uma revisão de snap desativada e procura por "desativado" especificamente na coluna de notas.


oh hah eu editei a minha resposta com base em seus comentários sobre isso, mas apenas viu que você adicionou uma resposta basicamente idêntico :)
casper.dcl

4
Infelizmente, na minha versão do snap (2.38 + 18.10 no Ubuntu 18.10), a coluna Notas é $6melhor que $5. O snap listcomando realmente precisa de uma --formatopção para que a saída possa ser consistente para scripts.
Mike Hicks

@MikeHicks Você poderia arquivar o bug aqui
Pablo Bianchi

0

Com base nas sugestões de @Chipaca, @ Ctrl-C e @Pablo Lalloni:

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

Ele procura por "desativado" na coluna "Anotações" snap list --alle é executado snap remove <snap> --revision <rev>no snap correspondente.


Eu não entendi
Pierre.Vriens 29/03

Você pode evitar o erro usando o sinalizador -ar do xarg.
Pablo Lalloni 31/03/19

Problema é que comando pode remover fotos com "pessoas com deficiência" em seu nome ... improvável, mas ...
Pablo Lalloni

0

Depois de ver a nota de Mike sobre esses scripts quebrando entre as versões porque o número de colunas de saída mudou, fui ver se há alguma ligação legível por máquina para essas coisas.

O que eu encontrei foi a API REST do snapd .

O equivalente de snap list --allé

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

Retorna JSON. Para filtrá-lo para pacotes não ativos e transformá-lo em uma lista de snap removecomandos, você pode usar jq:

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

Tecnicamente, você pode executar tudo isso em uma única linha (as quebras que inseri são para facilitar a leitura), mas é um punhado, então envolvi-o em um script: remove-disabled-snaps.sh

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.