因为它似乎与%O
显示格式转义生成的字符串不同,也与 的 URL 不同sources.list.d
。
就我而言,我正在寻找从非 Ubuntu 源安装的软件包,我遇到的麻烦可以在此示例中看到:
$ aptitude search --display-format '%v %p %O#' '?exact-name(syncthing)'
1.23.6 syncthing Syncthing:syncthing [amd64]
$ aptitude search --display-format '%v %p %O#' '?exact-name(syncthing) !?origin(ubuntu)'
$ aptitude search --display-format '%v %p %O#' '?exact-name(syncthing) ?origin(ubuntu)'
1.23.6 syncthing Syncthing:syncthing [amd64]
$
当?origin
根本不包含该术语时,SyncThing 会显示不包含“ubuntu”的来源,因此我预计在添加时它会保留!?origin(ubuntu)
(即“不能来自与模式‘ubuntu’匹配的来源”)。相反,它会消失,除非我更改该术语以要求它做来自与“ubuntu”匹配的来源!
查看来源列表也没有什么启发:
$ cat /etc/apt/sources.list.d/syncthing.list
deb [signed-by=/etc/apt/keyrings/syncthing-release-key.gpg] https://apt.syncthing.net/ syncthing stable
这显然不是“所有来源都匹配‘ubuntu’”的情况,但是,如果我查看 VS Code 而不是 SyncThing,它的行为符合预期:
$ aptitude search --display-format '%v %p %O#' '?exact-name(code)'
1.81.0-1690980 code code stable:stable [amd64]
$ aptitude search --display-format '%v %p %O#' '?exact-name(code) !?origin(ubuntu)'
1.81.0-1690980 code code stable:stable [amd64]
$ aptitude search --display-format '%v %p %O#' '?exact-name(code) ?origin(ubuntu)'
$
那么搜索词实际上如何?origin
表现?它匹配什么?
答案1
搜索aptitude
词与存储库文件中的值?origin
匹配。Origin
Release
例如,在 22.04 的一个非常基本的安装中,输出apt-cache policy
列出了以下存储库。在此输出中,搜索词?origin
与o=
值进行比较,该值Ubuntu
适用于此计算机上的所有存储库。
root@ubuntu:~# apt-cache policy
Package files:
100 /var/lib/dpkg/status
release a=now
500 http://security.ubuntu.com/ubuntu jammy-security/restricted amd64 Packages
release v=22.04,o=Ubuntu,a=jammy-security,n=jammy,l=Ubuntu,c=restricted,b=amd64
origin security.ubuntu.com
500 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages
release v=22.04,o=Ubuntu,a=jammy-security,n=jammy,l=Ubuntu,c=main,b=amd64
origin security.ubuntu.com
500 http://archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages
release v=22.04,o=Ubuntu,a=jammy-updates,n=jammy,l=Ubuntu,c=restricted,b=amd64
origin archive.ubuntu.com
500 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages
release v=22.04,o=Ubuntu,a=jammy-updates,n=jammy,l=Ubuntu,c=main,b=amd64
origin archive.ubuntu.com
500 http://archive.ubuntu.com/ubuntu jammy/restricted amd64 Packages
release v=22.04,o=Ubuntu,a=jammy,n=jammy,l=Ubuntu,c=restricted,b=amd64
origin archive.ubuntu.com
500 http://archive.ubuntu.com/ubuntu jammy/main amd64 Packages
release v=22.04,o=Ubuntu,a=jammy,n=jammy,l=Ubuntu,c=main,b=amd64
origin archive.ubuntu.com
浏览存储库的 Release 文件会显示相应的值。例如http://us.archive.ubuntu.com/ubuntu/dists/jammy/Release包含
Origin: Ubuntu
Label: Ubuntu
Suite: jammy
Version: 22.04
Codename: jammy
你可以使用以下命令aptitude
搜索可用的软件包Origin
aptitude search "?origin(Ubuntu)"
您可以搜索“我从非 Ubuntu 源安装的软件包”。?origin(.*)
可以添加搜索词以避免可能没有任何 的软件包出现问题origin
。
aptitude search "?and(?installed, ?not(?origin(Ubuntu)))"
or
aptitude search "?and(?installed, ?origin(.*), ?not(?origin(Ubuntu)))"
Ubuntu
作为一个更复杂的例子,我最喜欢的命令之一是从官方存储库(包括)中查找所有可用更新的软件包UbuntuESM
。
aptitude search "?and(?upgradable, ?narrow(?version(CANDIDATE), ?origin(^Ubuntu~(ESM~){0,1}$)))"
起源名称特别令人困惑,因为
- 正如原始问题所述,搜索词与
?origin
显示格式值不匹配。%O
apt_preferences
允许您指定一个origin
,但与origin
存储库主机名匹配。例如archive.ubuntu.com
。unattended-upgrades
Allowed-Origins
具有真正的存储库值组合的配置。
同步
如果我添加syncthing
存储库,那么syncthing
包将同时存在Ubuntu
和Syncthing
来源。
输出apt-cache policy
显示有关存储库的以下信息。
500 https://apt.syncthing.net syncthing/stable amd64 Packages
release o=Syncthing,a=syncthing,n=debian,l=Syncthing,c=stable,b=amd64
origin apt.syncthing.net
输出apt-cache policy syncthing
显示了 Syncthing 和 Ubuntu 存储库中可用的包。
root@ubuntu:~# apt-cache policy syncthing
syncthing:
Installed: (none)
Candidate: 1.23.6
Version table:
1.23.6 500
500 https://apt.syncthing.net syncthing/stable amd64 Packages
1.23.5 500
500 https://apt.syncthing.net syncthing/stable amd64 Packages
1.18.0~ds1-3ubuntu0.2 500
500 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages
500 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 Packages
1.18.0~ds1-3 500
500 http://archive.ubuntu.com/ubuntu jammy/universe amd64 Packages
类似的 aptitude 搜索?and(?origin(Ubuntu), ?exact-name(syncthing))
将会匹配,syncthing
因为有一个与该软件包匹配的版本。
我尝试过的一些测试
root@ubuntu:~# aptitude search "?and(?origin(Ubuntu), ?exact-name(syncthing))" -F "%p,%m#,%O#" | column -t
syncthing,Syncthing Release Management <[email protected]>,Syncthing:syncthing [amd64]
root@ubuntu:~# aptitude search "?any-version(?and(?origin(Ubuntu), ?exact-name(syncthing)))" -F "%p,%m#,%O#" | column -t
syncthing,Syncthing Release Management <[email protected]>,Syncthing:syncthing [amd64]
root@ubuntu:~# aptitude search "?all-versions(?and(?origin(Ubuntu), ?exact-name(syncthing)))" -F "%p,%m#,%O#" | column -t
您可以尝试使用搜索词来?narrow
限制软件包的特定版本。这应该会显示已安装的软件包,其中安装版本的来源不是Ubuntu
。
aptitude search "?narrow(?version(CURRENT),?and(?origin(.*),?not(?origin(^Ubuntu))))"
笔记
我希望有一个可以参考的来源。这只是我过去通过测试得出的信息。