我如何列出已安装的 snap 包以及它们的轨迹/风险/分支?

我如何列出已安装的 snap 包以及它们的轨迹/风险/分支?

语境

我想列出我的机器上已安装的 snap 包及其频道信息 ( <track>/<risk>/<branch>)。我的目的是将这些数据存储在一个文件中,这样我就可以以某种方式在新系统上重新安装相同的 snap 包。

问题

内置命令snap list似乎旨在向人类打印数据,并且没有选项来调整其输出以完整转储某些字段。

所以我有一个漂亮的显示(“漂亮”就像“赏心悦目”一样):

$ snap list
Name                            Version                     Rev    Tracking         Publisher       Notes
firefox                         106.0.5-1                   2067   latest/stable    mozilla✓        -
snap-store                      41.3-64-g512c0ff            599    latest/stable/…  canonical✓      -
...

但我不知道如何将其限制为,比如说,Name / Tracking(注意:我知道那部分只是一个awk '{ print $1, $4 }'衬垫),或者如何获得完整的轨道规范而不是snap-store ... latest/stable/…

我也尝试寻找存储其配置文件的位置(例如:说:应该从 更新的snap文件),但我找不到配置目录,我在或中没有找到运气。firefoxlatest/stable/etc/snap<something>man snapsnap help *

我开始查看dpkg -L snap哪些目录/文件可能与 snap 有关,但我认为我最好问问,而不是自己开始进行逆向工程。

我的问题

如何获取系统上已安装的快照列表以及详细的轨道信息?

如果我仅使用snap命令就能获得它,那就更好了,但是使用常见的 CLI 工具(find, awk, grep, jq ...)从磁盘上的纯文本文件中获取它也是可以接受的。


额外信息:

$ snap --version
snap    2.57.5+22.04
snapd   2.57.5+22.04
series  16
ubuntu  22.04
kernel  5.15.0-52-generic

答案1

正如您所发现的,该snap命令在输出格式方面存在限制。您可以使用 获取包含所有信息的每个快照的完整列表--verbose

 for f in $(snap list| tail -n +2 | awk '{print $1}'); do snap info --verbose $f; done

这将打印安装的每个快照及其所有频道信息。

答案2

构建于@popey 的回答,下面是我编写的用于列出已安装的快照的脚本:

for f in $(snap list| tail -n +2 | awk '{print $1}'); do
    snap info $snap |\
      grep -E -e "^(name|tracking):" |\
      awk '{ if (name) { print name"\t"$2; } name=$2 }'
done

# sample output:
# bare  latest/stable
# btop  latest/stable
# chromium  latest/stable
# gtk-common-themes latest/stable/ubuntu-22.04

它看起来snap需要永远运行snap info,这里有一种并行运行的方法:

#!/bin/bash

get_snap_info () {
    local snap=$1
    snap info $snap |\
      grep -E -e "^(name|tracking):" |\
      awk '{ if (name) { print name"\t"$2; } name=$2 }'
}

export -f get_snap_info

snap list| tail -n +2 | awk '{print $1}' | parallel --keep-order get_snap_info

相关内容