Как удалить отключенные (неиспользуемые) пакеты моментальных снимков с помощью одной командной строки?

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. Теперь я должен сделать это для всех ревизий и для всех пакетов один за другим. Есть ли какая-нибудь команда, которая удалит отключенные или неиспользуемые пакеты моментальных снимков одной строкой команды?

Заранее спасибо...

Ryko
источник
1
Да, конечно!! Я редактировал вопрос ...
Рыко
Обратите внимание, что сохранение одной предыдущей версии является заданным : при обновлении оснастки более старая версия будет удалена.
Муру
Но здесь у gimp есть 3 версии (ревизия-30,38,39). Хотя ревизии 38 и 39 имеют одинаковые версии ... Я сообщу вам позже, когда какое-либо из этих приложений получит дальнейшие обновления ...
Рыко
Есть ли какие-либо настройки, доступные в привязке, чтобы я мог отключить сохранение предыдущих версий приложений привязки ... Поскольку некоторые из них требуют так много места ... как libre-office занимает почти 2 ГБ пространства, и если предыдущая версия имеет включается становится 4гб.
Рыко
Сейчас над этим работает разработчик 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

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

Chipaca
источник
Я бы добавил sudo к командам привязки .
Пьер Франсуа
1
нет, не делайте этого: явно должен делать sudo вызывающий.
Чипака
более того, вам не обязательно нужен sudo для snap remove(если вы это сделали snap login)
Chipaca
1
Вы можете использовать это, xargsчтобы сделать это oneliner :)
Ctrl-C
@ Ctrl-C Я говорю,
дерзай
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) столбец «Примечания», $6а не $5. snap listКоманда действительно нуждается --formatпараметр , чтобы выход может быть последовательным для сценариев.
Майк Хикс
@MikeHicks Вы можете отправить сообщение об ошибке здесь
Пабло Бьянки
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>соответствующая привязка.

casper.dcl
источник
Я не понимаю
Pierre.Vriens
Вы можете избежать ошибки, используя флаг xarg -r.
Пабло Лаллони
Проблема в том, что команда могла удалить снимки с «отключенным» в своем названии ... маловероятно, но ...
Пабло Лаллони
0

Увидев заметку Майка об этих скриптах, разбивающихся между версиями, потому что количество выходных столбцов изменилось, я посмотрел, есть ли какие-нибудь машиночитаемые привязки к этой вещи.

То, что я нашел, было REST API Snapd .

Эквивалент snap list --allIS

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

keturn
источник