![インストールされたスナップの古いバージョンを削除する方法](https://rvso.com/image/1557624/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%9F%E3%82%B9%E3%83%8A%E3%83%83%E3%83%97%E3%81%AE%E5%8F%A4%E3%81%84%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.png)
私はスナップの使用に慣れておらず、システムにインストールされているアプリもほとんどありません。コマンドを実行すると、df -h
同じスナップの異なるバージョンがマウントされていることに気づきました。
/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
削除する短いスクリプトは次のとおりです全て古いバージョンのスナップ。これにより、現在アクティブなバージョンのみが保持され、ディスク領域がいくらか回復されるはずです。
#!/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