Bagaimana cara menghapus paket snap yang dinonaktifkan (tidak digunakan) dengan satu baris perintah?

18

Ketika saya menjalankan snap list --allperintah itu menunjukkan semua versi snap paket yang diinstal.

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     -

Sekarang ada begitu banyak paket yang dinonaktifkan di sana yang tidak lagi digunakan. Jadi saya ingin menghapus paket-paket itu. Di sini perintahnya snap remove gnome-3-26-1604 --revision=62. Sekarang saya harus melakukannya untuk semua revisi dan untuk semua paket satu per satu. Apakah ada perintah yang akan menghapus paket snap yang dinonaktifkan atau tidak digunakan dengan satu baris perintah?

Terima kasih sebelumnya...

Ryko
sumber
1
Ya, tentu!! Saya telah mengedit pertanyaan ...
Ryko
Perhatikan bahwa menjaga satu versi sebelumnya adalah dengan desain : ketika snap diperbarui, revisi yang lebih lama akan dihapus.
muru
Tetapi di sini gimp memiliki 3 versi (revisi-30,38,39). Meskipun revisi 38 dan 39 memiliki versi yang sama ... Saya akan memberi tahu Anda nanti ketika salah satu aplikasi ini mendapatkan pembaruan lebih lanjut ...
Ryko
Apakah ada pengaturan yang tersedia dalam sekejap sehingga saya dapat menonaktifkan menjaga aplikasi snap versi sebelumnya ... Karena beberapa dari mereka memerlukan begitu banyak ruang ... seperti libre-office mengambil hampir 2GB ruang, dan jika versi sebelumnya adalah termasuk itu menjadi 4GB.
Ryko
Ini sedang dikerjakan oleh pengembang snapd sekarang: github.com/snapcore/snapd/pull/5207
Zygmunt Krynicki

Jawaban:

21

Saya akan melihat ke dalam menambahkan ini dalam waktu dekat (sebagai 20% hal). Sementara itu, kamu bisa jatuh

#!/bin/sh
set -eu

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

menjadi skrip shell dan jalankan itu.

Chipaca
sumber
Saya akan menambahkan sudo ke perintah snap .
Pierre François
1
tidak, jangan lakukan itu: sudo harus dilakukan oleh penelepon, secara eksplisit.
Chipaca
Selain itu, Anda tidak perlu sudo untuk snap remove(jika Anda melakukan snap login)
Chipaca
1
Anda dapat menggunakannya xargsuntuk menjadikannya oneliner :)
Ctrl-C
@ Ctrl-C Saya katakan pergi untuk itu
Chipaca
4

Saya menemukan lebih elegan dan mudah digunakan pada alias (menggunakan tanda kutip tunggal) solusi ini :

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

Mulai dari snap 2.34 dan kemudian, Anda dapat mengatur jumlah maksimum revisi snap yang disimpan oleh sistem dengan mengatur refresh.retainopsi ( sumber ).

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

Kemampuan untuk membersihkan / menghapus snap lama / cacat telah dibahas sebelumnya tetapi belum diimplementasikan. Sementara itu sayangnya ini proses manual.

popey
sumber
1
Apakah ada cara untuk mendapatkan informasi yang dapat dibaca mesin tentang jepretan (JSON atau serupa) yang dapat dengan mudah diurai untuk mengotomatiskan ini?
muru
1
Sepertinya diskusi sebenarnya mencatat bahwa jepretan lama dihapus secara otomatis, sehingga ada maksimal tiga. Pembahasannya adalah tentang membuat angka tersebut dapat dikonfigurasi.
nealmcb
1

Membangun jawaban sebelumnya, Anda mungkin harus melakukan sesuatu seperti:

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

Yang menghindari memancarkan kesalahan ketika tidak ada revisi snap dinonaktifkan dan mencari "dinonaktifkan" secara khusus di kolom catatan.

Pablo Lalloni
sumber
oh hah saya mengedit jawaban saya berdasarkan komentar Anda di atasnya, tetapi hanya melihat bahwa Anda telah menambahkan jawaban yang pada dasarnya identik :)
casper.dcl
4
Sayangnya dalam versi snap saya (2.38 + 18.10 di Ubuntu 18.10), kolom Notes $6bukan $5. The snap listperintah benar-benar membutuhkan --formatpilihan sehingga output yang dapat konsisten untuk scripting.
Mike Hicks
@MikeHicks Anda dapat mengajukan bug di sini
Pablo Bianchi
0

Membangun saran @Chipaca, @ Ctrl-C, dan @Pablo Lalloni:

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

Ini mencari "nonaktif" di kolom "Catatan" snap list --alldan menjalankan snap remove <snap> --revision <rev>snap yang sesuai.

casper.dcl
sumber
Saya tidak mengerti
Pierre.Vriens
Anda dapat menghindari kesalahan menggunakan xr's -r flag.
Pablo Lalloni
Masalahnya adalah bahwa perintah dapat menghapus buncis dengan "dinonaktifkan" dalam namanya ... tidak mungkin tetapi ...
Pablo Lalloni
0

Setelah melihat catatan dari Mike tentang skrip yang melanggar antar versi karena jumlah kolom output berubah, saya mencari untuk melihat apakah ada binding yang dapat dibaca mesin untuk hal ini.

Yang saya temukan adalah API SISA snapd .

Setara dengan snap list --allis

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

Ia mengembalikan JSON. Untuk memfilternya ke paket yang tidak aktif dan mengubahnya ke daftar snap removeperintah, Anda dapat menggunakan jq:

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

Anda secara teknis dapat menjalankan semua itu dalam satu baris (jeda yang saya masukkan adalah untuk dibaca), tapi cukup sedikit, jadi saya membungkusnya dalam sebuah skrip: remove-disabled-snaps.sh

keturn
sumber