![Как удалить старую версию установленных snaps](https://rvso.com/image/1557624/%D0%9A%D0%B0%D0%BA%20%D1%83%D0%B4%D0%B0%D0%BB%D0%B8%D1%82%D1%8C%20%D1%81%D1%82%D0%B0%D1%80%D1%83%D1%8E%20%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8E%20%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B%D1%85%20snaps.png)
Я новичок в использовании 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