Как удалить старую версию установленных snaps

Как удалить старую версию установленных snaps

Я новичок в использовании Snap, в моей системе установлено несколько приложений, и я заметил, что при запуске команды df -hя обнаружил, что смонтированы разные версии одного и того же Snap:

/dev/loop0       143M   143M     0 100% /var/lib/snapd/snap/gravit-designer/7
/dev/loop1        82M    82M     0 100% /var/lib/snapd/snap/core/4110
/dev/loop7       198M   198M     0 100% /var/lib/snapd/snap/polarr/3
/dev/loop2        82M    82M     0 100% /var/lib/snapd/snap/core/4206
/dev/loop3       143M   143M     0 100% /var/lib/snapd/snap/gravit-designer/6
/dev/loop10      137M   137M     0 100% /var/lib/snapd/snap/gravit-designer/5

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

Есть ли что-то похожее pruneна обслуживание моей системы?

решение1

Вот короткий скрипт, который удалитвсестарые версии snaps. Это сохранит только текущую активную версию, что должно освободить вам немного места на диске:

#!/bin/bash
# Removes old revisions of snaps
# CLOSE ALL SNAPS BEFORE RUNNING THIS
set -eu

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

"Закрыть привязки" там, потому что вы, возможно, не перезапустили приложение перед обновлением. Так что, возможно, вы на самом деле запускаете ревизию, которая должна быть удалена скриптом.

решение2

Версияскрипт из другого ответа, в одну строку, без зависимости awk:

snap list --all | while read snapname ver rev trk pub notes; do if [[ $notes = *disabled* ]]; then snap remove "$snapname" --revision="$rev"; fi; done

Для этого, вероятно, потребуется bashоболочка, совместимая с [[конструкцией.

решение3

Начиная с snap v2.34 и более поздних версий, вы можете задать максимальное количество ревизий snap, хранящихся для каждого пакета, установив параметр refresh.retain— это может быть только числоот 2 до 20и имеетзначение по умолчанию 3.

sudo snap set system refresh.retain=2 

решение4

Код@popey поделился в своем ответена самом деле иногда не получается, так как некоторые сломанные пакеты не имеют информации о версии. Поэтому я изменил код, чтобы обойти это.

#!/bin/bash
# Removes old revisions of snaps
# CLOSE ALL SNAPS BEFORE RUNNING THIS
set -eu

snapsToRemove=$(LANG=en_US.UTF-8 snap list --all | awk '/disabled/{print $1, $2, $3}')

while read snapname version revision; do
    if [[ "$revision" == *[a-zA-z]* ]]; then
        # Version field is empty. Revision is in second field
        revision=$version
    fi
        snap remove "$snapname" --revision="$revision"
done <<< $snapsToRemove

Связанный контент