Wie entferne ich deaktivierte (nicht verwendete) Snap-Pakete mit einer einzigen Befehlszeile?

18

Wenn ich den snap list --allBefehl ausführe , werden alle installierten Versionen von Snap-Paketen angezeigt.

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     -

Jetzt gibt es so viele deaktivierte Pakete, die nicht mehr verwendet werden. Also möchte ich diese Pakete entfernen. Hier ist der Befehl snap remove gnome-3-26-1604 --revision=62. Jetzt muss ich es für alle Revisionen und für alle Pakete nacheinander tun. Gibt es einen Befehl, der die deaktivierten oder nicht verwendeten Snap-Pakete mit einer einzigen Befehlszeile entfernt?

Danke im Voraus...

Ryko
quelle
Könnten Sie Ihre Frage bearbeiten und statt eines Bildes den Text kopieren und einfügen? Es wird dringend davon abgeraten, Bilder zu haben, es sei denn, dies wird unbedingt benötigt. Es hilft uns, Ihnen zu helfen. Vielen Dank!
Terrance
1
Ja sicher!! Ich habe die Frage bearbeitet ...
Ryko
Beachten Sie, dass eine einzige vorherige Version zu halten ist durch Design : Wenn ein Snap aktualisiert wird, wird die ältere Version entfernt werden.
muru
Aber hier hat gimp 3 Versionen (revision-30,38,39). Obwohl Revision 38 und 39 die gleichen Versionen haben ... werde ich Sie später informieren, wenn eine dieser Apps weitere Updates erhält ...
Ryko
Sind in snap irgendwelche Einstellungen verfügbar, damit ich die Beibehaltung früherer Versionen der Snap-Anwendungen deaktivieren kann? Weil einige von ihnen so viel Speicherplatz benötigen ... wie libre-office fast 2 GB Speicherplatz beansprucht und wenn die vorherige Version vorhanden ist enthalten wird es 4 GB.
Ryko

Antworten:

21

Ich werde bald darüber nachdenken, dies hinzuzufügen (als 20% ige Sache). In der Zwischenzeit könnten Sie fallen

#!/bin/sh
set -eu

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

in ein Shell-Skript und führen Sie das aus.

Chipaca
quelle
Ich würde ein prepend sudo zu den Snap - Befehle.
Pierre François
1
nein, tu das nicht: sudo sollte explizit vom aufrufer gemacht werden.
Chipaca
Außerdem brauchst du nicht unbedingt sudo für snap remove(wenn du es getan hast snap login)
Chipaca
1
Sie können verwenden xargs, um es zu einem Oneliner zu machen :)
Strg-C
@ Ctrl-C Ich sage los
Chipaca
3

Ich fand diese Lösung eleganter und benutzerfreundlicher für einen Alias ​​(mit einfachen Anführungszeichen) :

snap list --all | while read snapname ver rev trk pub notes; do if [[ $notes = *disabled* ]]; then sudo snap remove "$snapname" --revision="$rev"; fi; done

Ab Snap 2.34 können Sie die maximale Anzahl der vom System gespeicherten Snap-Revisionen festlegen, indem Sie eine refresh.retainOption ( Quelle ) festlegen .

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

Die Möglichkeit, alte / deaktivierte Snaps zu löschen / entfernen, wurde bereits erörtert, aber noch nicht implementiert. In der Zwischenzeit ist es leider ein manueller Vorgang.

Popey
quelle
1
Gibt es überhaupt maschinenlesbare Informationen zu Snaps (JSON oder ähnliches), die einfach analysiert werden können, um dies zu automatisieren?
muru
1
Es sieht so aus, als ob die Diskussion tatsächlich feststellt, dass alte Druckknöpfe automatisch entfernt werden, so dass es maximal drei gibt. In der Diskussion geht es darum, die Nummer konfigurierbar zu machen.
Nealmcb
1

Aufbauend auf früheren Antworten sollten Sie wahrscheinlich Folgendes tun:

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

Dadurch wird vermieden, dass ein Fehler ausgegeben wird, wenn keine deaktivierte Snap-Revision vorhanden ist, und in der Spalte "Notizen" nach "deaktiviert" gesucht.

Pablo Lalloni
quelle
oh hah, ich habe meine Antwort basierend auf Ihren Kommentaren bearbeitet, aber ich habe gerade gesehen, dass Sie eine im Grunde identische Antwort hinzugefügt haben :)
casper.dcl
4
Leider ist in meiner Version von snap (2.38 + 18.10 unter Ubuntu 18.10) die Notes-Spalte $6eher als $5. Der snap listBefehl benötigt wirklich eine --formatOption, damit die Ausgabe für die Skripterstellung konsistent ist.
Mike Hicks
@ MikeHicks Sie können den Bug hier
Pablo Bianchi
0

Aufbauend auf @Chipaca, @ Ctrl-C und @Pablo Lallonis Vorschlägen:

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

Dadurch wird in der Spalte "Notizen" nach "deaktiviert" gesucht snap list --allund snap remove <snap> --revision <rev>der entsprechende Fang ausgeführt.

casper.dcl
quelle
Ich verstehe es nicht
Pierre.Vriens
Sie können den Fehler mithilfe des Flags -r von xarg vermeiden.
Pablo Lalloni
Problem ist, dass Befehl Schnappschüsse mit "deaktiviert" im Namen entfernen könnte ... unwahrscheinlich, aber ...
Pablo Lalloni
0

Nachdem ich die Notiz von Mike über diese Skripte gesehen hatte, die zwischen den Versionen unterbrochen wurden, weil sich die Anzahl der Ausgabespalten geändert hatte, ging ich auf die Suche nach maschinenlesbaren Bindungen für dieses Zeug.

Was ich gefunden habe, war die REST-API von snapd .

Das Äquivalent von snap list --allist

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

Es wird JSON zurückgegeben. Um es nach inaktiven Paketen zu filtern und in eine Liste von snap removeBefehlen umzuwandeln, können Sie Folgendes verwenden jq:

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

Sie könnten technisch alles in einer einzigen Zeile ausführen (die von mir eingefügten Pausen dienen der Lesbarkeit), aber es ist eine ziemliche Handvoll, also habe ich es in ein Skript eingeschlossen: remove-disabled-snaps.sh

keturn
quelle