Як видалити відключені (невикористані) пакети оснащення одним рядком команди?


19

Коли я запускаю snap list --allкоманду, вона показує всі встановлені версії оснащених пакетів.

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. Тепер я маю це зробити для всіх версій і для всіх пакетів по одному. Чи є якась команда, яка видалить відключені або невикористані пакети оснащення одним рядком команди?

Спасибі заздалегідь...


1
Так, звісно!! Я відредагував питання ...
Рико

Зауважте, що збереження однієї попередньої версії є задумом : коли оновлюється оснащення, старіша версія буде видалена.
муру

Але тут gimp має 3 версії (редакція-30,38,39). Хоча версії 38 та 39 мають однакові версії ... я повідомлю вас пізніше, коли будь-яка з цих додатків отримає подальші оновлення ...
Ryko

Чи є якісь параметри, доступні для оснащення, щоб я міг відключити збереження попередніх версій оснащення програм ... Тому що для деяких з них потрібно стільки місця ... як, наприклад, libre-office займає майже 2 Гб місця, і якщо попередня версія включений він стає 4 Гб.
Рико

Над цим зараз працює розробник оснащених програм
Zygmunt Krynicki

Відповіді:


22

Я розберуся про те, що незабаром додамо це (як річ на 20%). Тим часом, ти можеш кинути

#!/bin/sh
set -eu

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

в сценарій оболонки і запустіть це.


Я б додав судо до оснащення команд.
П'єр Франсуа

1
ні, не робіть цього: судо повинен робити абонент, явно.
Chipaca

Крім того, вам не обов'язково потрібно судо для snap remove(якщо ви зробили це snap login)
Chipaca

1
Ви можете використовувати xargsйого для онлайнера :)
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

Починаючи з оснащення 2.34 і пізніше, ви можете встановити максимальну кількість ревізій оснащення, що зберігаються системою, встановивши refresh.retainпараметр ( джерело ).

sudo snap set system refresh.retain=2 

2

Можливість очищення / видалення старих / відключених знімків обговорювалася раніше, але ще не реалізована. Тим часом, на жаль, це ручний процес.


1
Чи все-таки можна отримати машиночитану інформацію про знімки (JSON або подібні), які можна легко проаналізувати для автоматизації цього?
муру

1
Схоже, дискусія насправді зазначає, що старі знімки автоматично видаляються, так що максимум три. Дискусія полягає в тому, щоб зробити число, яке можна настроювати.
nealmcb

1

Спираючись на попередні відповіді, ви, ймовірно, повинні робити щось на кшталт:

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

Це дозволяє уникнути помилки, коли не було відключеної оснащеної перегляду, і шукає "вимкнено" спеціально у стовпці приміток.


о-ха-ха, я відредагував свою відповідь, грунтуючись на ваших коментарях до неї, але щойно побачив, що ви додали принципово однакову відповідь :)
casper.dcl

4
На жаль, у моїй версії оснащення (2.38 + 18.10 на Ubuntu 18.10), стовпчик Notes - це $6швидше, ніж $5. snap listКоманда дійсно потребує --formatпараметр , щоб вихід може бути послідовним для сценаріїв.
Майк Хікс


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

Ви можете уникнути помилки, використовуючи прапор xrg -r.
Пабло Лаллоні

Проблема полягає в тому, що команда може видалити оснастки з "відключеним" в її імені ... малоймовірно, але ...
Пабло Лаллоні

0

Побачивши замітку Майка про те, що ці сценарії розбиваються між версіями через те, що кількість вихідних стовпців змінилася, я пішов шукати, чи є якісь машиночитані прив’язки до цього матеріалу.

Що я знайшов, це REST API snapd .

Еквівалент 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.