Làm thế nào để loại bỏ các gói snap bị vô hiệu hóa (không sử dụng) với một dòng lệnh?


18

Khi tôi chạy snap list --alllệnh, nó hiển thị tất cả các phiên bản đã cài đặt của gói 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     -

Bây giờ có rất nhiều gói bị vô hiệu hóa không còn được sử dụng. Vì vậy, tôi muốn loại bỏ các gói. Đây là lệnh snap remove gnome-3-26-1604 --revision=62. Bây giờ tôi phải làm điều đó cho tất cả các sửa đổi và cho tất cả các gói từng cái một. Có lệnh nào sẽ loại bỏ các gói snap bị vô hiệu hóa hoặc không sử dụng với một dòng lệnh không?

Cảm ơn trước...


1
Ừ chắc chắn!! Tôi đã chỉnh sửa câu hỏi ...
Ryko

Lưu ý rằng việc giữ một phiên bản trước đó là theo thiết kế : khi một snap được cập nhật, phiên bản cũ hơn sẽ bị xóa.
muru

Nhưng ở đây gimp có 3 phiên bản (sửa đổi-30,38,39). Mặc dù phiên bản 38 và 39 có cùng phiên bản ... Tôi sẽ thông báo cho bạn sau khi bất kỳ ứng dụng nào trong số này được cập nhật thêm ...
Ryko

Có cài đặt nào có sẵn trong snap để tôi có thể vô hiệu hóa việc giữ các phiên bản trước của ứng dụng snap không ... Bởi vì một số trong chúng đòi hỏi rất nhiều dung lượng ... như libre-office chiếm gần 2GB dung lượng và nếu phiên bản trước đó là bao gồm nó trở thành 4GB.
Ryko

Điều này đang được một nhà phát triển snapd thực hiện ngay bây giờ: github.com/snapcore/snapd/pull/5207
Zygmunt Krynicki

Câu trả lời:


21

Thỉnh thoảng tôi sẽ xem xét thêm điều này (với tỷ lệ 20%). Trong khi đó, bạn có thể thả

#!/bin/sh
set -eu

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

vào một kịch bản shell và chạy nó.


Tôi sẽ thêm một sudo cho các lệnh snap .
Pierre François

1
không, đừng làm vậy: sudo nên được thực hiện bởi người gọi, rõ ràng.
Chipaca

hơn nữa, bạn không nhất thiết cần sudo cho snap remove(nếu bạn đã làm snap login)
Chipaca

1
Bạn có thể sử dụng xargsđể biến nó thành một oneliner :)
Ctrl-C

@ Ctrl-C Tôi nói hãy dùng nó
Chipaca

4

Tôi thấy thanh lịch và dễ sử dụng hơn trên một bí danh (sử dụng dấu ngoặc đơn) giải pháp này :

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

Bắt đầu từ snap 2.34 trở lên, bạn có thể đặt số lượng tối đa các bản sửa đổi của snap được lưu trữ bởi hệ thống bằng cách đặt refresh.retaintùy chọn ( nguồn ).

sudo snap set system refresh.retain=2 

2

Khả năng thanh lọc / loại bỏ snaps cũ / khuyết tật đã được thảo luận trước đây nhưng chưa được thực hiện. Trong khi đó, thật không may, đó là một quá trình thủ công.


1
Có cách nào để có được thông tin dễ đọc bằng máy về snaps (JSON hoặc tương tự) có thể dễ dàng phân tích cú pháp để tự động hóa việc này không?
muru

1
Có vẻ như các cuộc thảo luận thực sự lưu ý rằng các snaps cũ được tự động loại bỏ, do đó có tối đa ba. Các cuộc thảo luận là về làm cho số cấu hình.
nealmcb

1

Dựa trên các câu trả lời trước đó, có lẽ bạn nên làm một cái gì đó như:

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

Điều này tránh phát ra lỗi khi không có sửa đổi snap bị vô hiệu hóa và tìm kiếm "bị vô hiệu hóa" cụ thể trong cột ghi chú.


oh hah Tôi đã chỉnh sửa câu trả lời của mình dựa trên nhận xét của bạn về nó, nhưng chỉ thấy rằng bạn đã thêm một câu trả lời cơ bản giống hệt nhau :)
casper.dcl

4
Thật không may trong phiên bản snap của tôi (2.38 + 18.10 trên Ubuntu 18.10), cột Ghi chú $6thay vì $5. Các snap listlệnh thực sự cần một --formattùy chọn để đầu ra có thể phù hợp cho kịch bản.
Mike Hicks

@MikeHicks Bạn có thể gửi lỗi tại đây
Pablo Bianchi

0

Xây dựng trên các đề xuất của @Chipaca, @ Ctrl-C và @Pablo Lalloni:

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

Điều này tìm kiếm "bị vô hiệu hóa" trong cột "Ghi chú" snap list --allvà chạy snap remove <snap> --revision <rev>của snap tương ứng.


Tôi không hiểu điều đó
Pierre.Vriens 29/03/19

Bạn có thể tránh lỗi khi sử dụng cờ -r của xarg.
Pablo Lalloni

Vấn đề là lệnh đó có thể loại bỏ snaps với "vô hiệu hóa" trong tên của nó ... không thể nhưng ...
Pablo Lalloni

0

Sau khi thấy ghi chú của Mike về các tập lệnh này bị phá vỡ giữa các phiên bản vì số lượng cột đầu ra đã thay đổi, tôi đã đi tìm xem liệu có bất kỳ ràng buộc nào có thể đọc được bằng máy với nội dung này không.

Những gì tôi tìm thấy là API REST của snapd .

Tương đương với snap list --all

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

Nó trả về JSON. Để lọc nó xuống các gói không hoạt động và chuyển nó vào danh sách các snap removelệnh, bạn có thể sử dụng jq:

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

Về mặt kỹ thuật, bạn có thể chạy tất cả những thứ đó trên một dòng duy nhất (các quãng nghỉ tôi chèn là để dễ đọc), nhưng nó khá dễ sử dụng, vì vậy tôi đã gói nó trong một tập lệnh: remove-disables-snaps.sh

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.