语境
我想列出我的机器上已安装的 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
文件),但我找不到配置目录,我在或中没有找到运气。firefox
latest/stable
/etc/snap<something>
man snap
snap 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