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...

Ryko
fonte
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.

Chipaca
fonte
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 
Pablo Bianchi
fonte
2

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

popey
fonte
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.

Pablo Lalloni
fonte
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.

casper.dcl
fonte
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

keturn
fonte