วิธีลบแพ็คเกจ snap ที่ปิดใช้งาน (ไม่ได้ใช้) ด้วยคำสั่งบรรทัดเดียว?


18

เมื่อฉันรันsnap list --allคำสั่งมันจะแสดงแพ็คเกจ 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     -

ขณะนี้มีแพ็กเกจที่ปิดใช้งานจำนวนมากซึ่งไม่ได้ใช้อีกต่อไป ดังนั้นฉันต้องการลบแพ็คเกจเหล่านั้น snap remove gnome-3-26-1604 --revision=62นี่เป็นคำสั่ง ตอนนี้ฉันต้องทำเพื่อแก้ไขทั้งหมดและสำหรับแพ็คเกจทั้งหมดหนึ่งต่อหนึ่ง มีคำสั่งใดบ้างที่จะลบแพ็คเกจ snap ที่ปิดใช้งานหรือไม่ได้ใช้ด้วยบรรทัดคำสั่งเดียว?

ขอบคุณล่วงหน้า...


1
ใช่แน่นอน!! ฉันได้แก้ไขคำถามแล้ว ...
Ryko

โปรดทราบว่าการเก็บรุ่นก่อนหน้าเดียวไว้ตามการออกแบบ : เมื่อมีการอัปเดต snap การแก้ไขที่เก่ากว่าจะถูกลบออก
muru

แต่ที่นี่ gimp มี 3 รุ่น (แก้ไข -30,38,39) แม้ว่าการแก้ไข 38 และ 39 จะมีรุ่นเดียวกัน ... ฉันจะแจ้งให้คุณทราบภายหลังเมื่อแอปใดแอปนี้ได้รับการอัปเดตเพิ่มเติม ...
Ryko

มีการตั้งค่าใด ๆ ที่พร้อมใช้งานใน snap ดังนั้นฉันจึงสามารถปิดใช้งานการเก็บแอปพลิเคชัน snap รุ่นก่อนหน้าได้ ... เพราะบางส่วนต้องการพื้นที่มาก ... เช่น libre-office ใช้พื้นที่เกือบ 2GB และถ้าเป็นรุ่นก่อนหน้า รวมมันกลายเป็น 4GB
Ryko

สิ่งนี้กำลังดำเนินการโดยนักพัฒนา snapd ตอนนี้: github.com/snapcore/snapd/pull/5207
Zygmunt Krynicki

คำตอบ:


21

ฉันจะพิจารณาเพิ่มในไม่ช้านี้ (เป็นสิ่งที่ 20%) ในขณะเดียวกันคุณสามารถลดลง

#!/bin/sh
set -eu

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

เป็นเชลล์สคริปต์และเรียกใช้สิ่งนั้น


ฉันจะเพิ่มsudoไปยังคำสั่งsnap
Pierre François

1
ไม่อย่าทำเช่นนั้น: sudo ควรถูกเรียกโดยผู้โทรอย่างชัดเจน
Chipaca

นอกจากนี้คุณไม่จำเป็นต้องใช้ sudo สำหรับsnap remove(ถ้าคุณทำsnap login)
Chipaca

1
คุณสามารถใช้xargsเพื่อทำให้มันเป็น oneliner :)
Ctrl-C

@ Ctrl-C ฉันว่าไปเลย
Chipaca

4

ฉันพบว่าสวยงามและใช้งานง่ายกว่าในนามแฝง (โดยใช้เครื่องหมายคำพูดเดี่ยว) โซลูชันนี้ :

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

เริ่มต้นจาก snap 2.34 และใหม่กว่าคุณสามารถกำหนดจำนวนสูงสุดของการแก้ไขของ snap ที่จัดเก็บโดยระบบโดยการตั้งค่าrefresh.retainตัวเลือก ( แหล่งที่มา )

sudo snap set system refresh.retain=2 

2

ความสามารถในการล้าง / ลบสแน็ปเก่า / ปิดใช้งานได้ถูกกล่าวถึงก่อนหน้านี้ แต่ยังไม่ได้ใช้งาน ในระหว่างนี้โชคไม่ดีที่มันเป็นกระบวนการแบบแมนนวล


1
อย่างไรก็ตามมีการรับข้อมูลที่เครื่องสามารถอ่านได้เกี่ยวกับ snaps (JSON หรือคล้ายกัน) ที่สามารถแยกวิเคราะห์เพื่อทำให้เป็นอัตโนมัติได้หรือไม่
muru

1
ดูเหมือนว่าการสนทนาจะสังเกตเห็นว่าสแนปเก่าจะถูกลบโดยอัตโนมัติเพื่อให้มีได้สูงสุดสาม การอภิปรายเกี่ยวกับการกำหนดหมายเลข
nealmcb

1

เมื่อสร้างคำตอบก่อนหน้าคุณควรทำสิ่งต่อไปนี้:

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

ซึ่งหลีกเลี่ยงการเปล่งข้อผิดพลาดเมื่อไม่มีการแก้ไข snap ปิดการใช้งานและมองหา "ปิดการใช้งาน" โดยเฉพาะในคอลัมน์บันทึก


โอ้ฉันแก้ไขคำตอบของคุณตามความคิดเห็นของคุณแล้ว แต่เพิ่งเห็นว่าคุณได้เพิ่มคำตอบที่เหมือนกัน :)
casper.dcl

4
แต่น่าเสียดายที่ในรุ่นของฉันของสแน็ป (2.38 + 18.10 บน Ubuntu 18.10) หมายเหตุคอลัมน์มากกว่า$6 คำสั่งจำเป็นต้องมีตัวเลือกเพื่อการส่งออกที่สามารถสอดคล้องกันสำหรับการเขียนสคริปต์ $5snap list--format
Mike Hicks


0

การสร้างคำแนะนำของ @Chipaca, @ Ctrl-C และ @Pablo Lalloni:

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

การค้นหานี้จะ "ปิดการใช้งาน" ในคอลัมน์ "หมายเหตุ" ของsnap list --allและเรียกsnap remove <snap> --revision <rev>ใช้การจัดชิดที่สอดคล้องกัน


ฉันไม่เข้าใจ
Pierre.Vriens

คุณสามารถหลีกเลี่ยงข้อผิดพลาดโดยใช้แฟล็ก -r ของ xarg
Pablo Lalloni

ปัญหาคือคำสั่งที่สามารถลบ snaps กับ "พิการ" ในชื่อ ... ไม่น่า แต่ ...
Pablo Lalloni

0

หลังจากเห็นข้อความจากไมค์เกี่ยวกับสคริปต์เหล่านี้แตกหักระหว่างเวอร์ชันเนื่องจากจำนวนคอลัมน์ผลลัพธ์เปลี่ยนไปฉันก็ไปดูว่ามีการผูกเครื่องที่อ่านได้ด้วยเครื่องสำหรับสิ่งนี้หรือไม่

สิ่งที่ผมพบคือsnapd ของ REST API

สิ่งที่เทียบเท่าsnap list --allคือ

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

ส่งคืน JSON หากต้องการกรองลงในแพ็คเกจที่ไม่ทำงานและเปลี่ยนเป็นรายการsnap removeคำสั่งคุณสามารถใช้jq:

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

ในทางเทคนิคคุณสามารถเรียกใช้ทั้งหมดที่อยู่ในบรรทัดเดียว (ตัวแบ่งที่ฉันแทรกไว้สำหรับการอ่าน) แต่มันค่อนข้างน้อยดังนั้นฉันจึงห่อมันไว้ในสคริปต์: remove-disabled-snaps.sh

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.