Jak usunąć wyłączone (nieużywane) pakiety Snap za pomocą jednej linii poleceń?

19

Po uruchomieniu snap list --allpolecenia pokazuje wszystkie zainstalowane wersje pakietów 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     -

Teraz jest tak wiele wyłączonych pakietów, które nie są już używane. Więc chcę usunąć te pakiety. Oto polecenie snap remove gnome-3-26-1604 --revision=62. Teraz muszę to zrobić dla wszystkich wersji i dla wszystkich pakietów jeden po drugim. Czy istnieje polecenie, które usunie wyłączone lub nieużywane pakiety przystawek za pomocą pojedynczego wiersza polecenia?

Z góry dziękuję...

Ryko
źródło
1
Tak jasne !! Zredagowałem pytanie ...
Ryko
Pamiętaj, że zachowanie jednej poprzedniej wersji jest zgodne z projektem : po aktualizacji przystawki starsza wersja zostanie usunięta.
muru
Ale tutaj gimp ma 3 wersje (wersja 30, 38, 39). Chociaż wersje 38 i 39 mają te same wersje ... Poinformuję cię później, gdy którakolwiek z tych aplikacji otrzyma dalsze aktualizacje ...
Ryko
Czy są dostępne jakieś ustawienia w snapie, żebym mógł wyłączyć przechowywanie poprzednich wersji aplikacji snap ... Ponieważ niektóre z nich wymagają tyle miejsca ... tak jak libre-office zajmuje prawie 2 GB miejsca, a jeśli poprzednia wersja jest dołączony staje się 4 GB.
Ryko
Nad tym pracuje teraz programista snapd
Zygmunt Krynicki

Odpowiedzi:

22

Niedługo zajmę się dodaniem tego (jako 20%). W międzyczasie możesz upaść

#!/bin/sh
set -eu

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

do skryptu powłoki i uruchom go.

Chipaca
źródło
Dodałbym sudo do poleceń snap .
Pierre François,
1
nie, nie rób tego: sudo powinno być wykonane przez osobę dzwoniącą, wyraźnie.
Chipaca
co więcej, niekoniecznie potrzebujesz sudo snap remove(jeśli to zrobiłeś snap login)
Chipaca
1
Możesz użyć xargsgo, aby był oneliner :)
Ctrl-C
@ Ctrl-C Mówię: idź na to
Chipaca
4

Znalazłem bardziej elegancki i łatwy w użyciu alias (używając pojedynczych cudzysłowów) to rozwiązanie :

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

Począwszy od snapu 2.34 i późniejszych, możesz ustawić maksymalną liczbę rewizji snapów przechowywanych przez system, ustawiając refresh.retainopcję ( źródło ).

sudo snap set system refresh.retain=2 
Pablo Bianchi
źródło
2

Możliwość usuwania / usuwania starych / wyłączonych snapów była wcześniej omawiana, ale jeszcze nie zaimplementowana. W międzyczasie jest to niestety proces ręczny.

Popey
źródło
1
Czy w ogóle można uzyskać odczytywalne maszynowo informacje o snapach (JSON lub podobne), które można łatwo przeanalizować, aby to zautomatyzować?
muru
1
Wygląda na to, że dyskusja faktycznie zauważa, że ​​stare zatrzaski są automatycznie usuwane, więc są maksymalnie trzy. Dyskusja dotyczy skonfigurowania numeru.
nealmcb
1

Opierając się na poprzednich odpowiedziach, powinieneś prawdopodobnie robić coś takiego:

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

Co pozwala uniknąć błędu, gdy nie ma wyłączonej wersji przyciągania i szuka słowa „wyłączone”, szczególnie w kolumnie notatek.

Pablo Lalloni
źródło
och hah Zredagowałem moją odpowiedź na podstawie twoich komentarzy na ten temat, ale właśnie zobaczyłem, że dodałeś w zasadzie identyczną odpowiedź :)
casper.dcl
4
Niestety w mojej wersji Snap (2.38 + 18.10 na Ubuntu 18.10) kolumna Notatki jest $6raczej niż $5. snap listKomenda naprawdę potrzebuje --formatopcję tak, że produkcja może być spójne dla skryptów.
Mike Hicks,
@MikeHicks Możesz zgłosić błąd tutaj
Pablo Bianchi
0

Opierając się na sugestiach @Chipaca, @ Ctrl-C i @Pablo Lalloni:

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

Wyszukuje „wyłączone” w kolumnie „Notatki” snap list --alli uruchamia snap remove <snap> --revision <rev>odpowiednią przystawkę.

casper.dcl
źródło
Nie rozumiem
Pierre.Vriens
Możesz uniknąć błędu, używając flagi -r xarg.
Pablo Lalloni
Problem polega na tym, że polecenie może usunąć zatrzaski z „wyłączony” w nazwie… mało prawdopodobne, ale…
Pablo Lalloni
0

Po tym, jak zobaczyłem informację od Mike'a o tym, że skrypty łamią się między wersjami, ponieważ zmieniła się liczba kolumn wyjściowych, zacząłem szukać, czy istnieją jakieś odczytywalne maszynowo powiązania z tymi rzeczami.

Znalazłem API REST snapd .

Odpowiednikiem snap list --alljest

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

Zwraca JSON. Aby przefiltrować go do nieaktywnych pakietów i zamienić na listęsnap remove poleceń, możesz użyć jq:

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

Technicznie można uruchomić to wszystko w jednym wierszu (przerwy, które wstawiłem, są czytelne), ale jest to dość garść, więc zawarłem to w skrypcie: remove-disabled-snaps.sh

keturn
źródło