`snap list --all`无法显示/var/lib/snapd/snaps中全部快照及旧快照清理残留问题咨询
snap list --all无法显示/var/lib/snapd/snaps中全部快照及旧快照清理残留问题咨询 嗨,我来帮你梳理下这个问题的原因和解决办法~
为什么snap list --all看不到所有快照文件?
snap list --all只会显示snapd正常管理的有效快照,那些没出现在列表里的.snap文件,大概率是以下情况:
- 之前删除旧版本快照时,snapd因为异常(比如操作中断、系统崩溃)没彻底清理的残留文件;
- 下载中断的不完整快照(比如你看到的
partial目录就是用来存放未完成下载的); - 损坏的快照文件,snapd无法识别,所以没纳入管理列表。
能不能直接删除这些残留文件?
可以,但要谨慎核对后再操作,避免误删正在使用的快照:
- 先确认这些文件对应的版本确实不在
snap list --all的输出里。比如你看到的chromium_2556.snap,执行snap list --all chromium如果只显示2642版本,那这个旧文件就可以安全删除; partial目录里的内容全是未完成的下载,完全可以直接删除,不会影响任何已安装的snap应用;- 绝对不要删除当前正在使用的快照(比如
snap list里没有disabled标记的版本对应的文件),否则会导致应用崩溃。
为什么你的清理脚本没删干净?
你用的脚本只针对标记为disabled的快照,但那些残留的文件对应的版本可能已经被完全移除(不在snap list --all里了),自然不会被脚本匹配到。这里提供一个更稳妥的脚本,可以自动找出所有未被snapd管理的快照文件:
# 生成snapd管理的所有快照文件名(格式:名称_版本号.snap) managed_snaps=$(snap list --all | awk '{if(NR>1) print $1 "_" $3 ".snap"}') # 遍历/var/lib/snapd/snaps下的所有.snap文件 for snap_file in /var/lib/snapd/snaps/*.snap; do filename=$(basename "$snap_file") # 检查当前文件是否在管理列表中 if ! echo "$managed_snaps" | grep -q "$filename"; then echo "发现未被管理的残留快照:$filename" # 确认无误后,把下面的注释去掉执行删除 # sudo rm "$snap_file" fi done
运行这个脚本时,先看输出的文件列表是不是都是你确认要删除的,没问题再取消注释执行删除。
额外提醒
如果之后还频繁出现这类残留问题,可以尝试更新snapd到最新版本(sudo snap refresh snapd),新版本的snapd在快照清理逻辑上会更稳定,减少异常残留的概率。
备注:内容来源于stack exchange,提问作者spraff
相关产品推荐
相关产品推荐

