查找从某个存储库安装的软件包


Answers:


17

使用aptitude,为了在稳定分支之外查找已安装的软件包,可以使用:

aptitude search "?narrow(?installed,?not(?archive(stable)))"

要查看版本和软件包名称(而不是描述),可以将命令与format选项(-F简称)一起使用,如下所示。

aptitude search -F "%p %V %v" "?narrow(?installed,?not(?archive(stable)))"

有关更多格式,请查看联机帮助页(此处是带有可用选项的文档)。

例如,在Debian中,如果您在Squeeze外部安装了软件包(例如,通过运行),就可以使用apt-get install -t sid package-name

您可以通过来查看已安装软件包的来源apt-cache policy,用法如下:

apt-cache policy <package-name>

例如,我的python-numpy包呈现以下输出:

$ LANG=C apt-cache policy python-numpy
python-numpy:
  Installed: 1:1.6.2-1
  Candidate: 1:1.6.2-1.2
  Version table:
     1:1.7.0-1 0
          1 http://ftp.es.debian.org/debian/ experimental/main amd64 Packages
     1:1.6.2-1.2 0
        500 http://ftp.es.debian.org/debian/ sid/main amd64 Packages
 *** 1:1.6.2-1 0
        100 /var/lib/dpkg/status
     1:1.4.1-5 0
        990 http://ftp.es.debian.org/debian/ squeeze/main amd64 Packages
        990 http://ftp.de.debian.org/debian/ squeeze/main amd64 Packages

这意味着我是当前sid / main分支后面的一个版本,因此我安装了旧sid版本。我知道我还没有一个稳定的稳定器,因为1.4.1-5我现在在1.6.2-1

在提交时,此软件包已更新:)


我更喜欢?any-version(),因为~narrow(pat1, pat2)和一样?any-version(pat1 pat2),它?any-version(pat1 pat2 pat3)看起来也不笨。
罗伯特·西默

18

阅读了有关能力的信息页面并进行了十多次尝试后,我终于明白了:

aptitude search '?narrow(?installed,?not(?archive(testing)) ?archive(unstable))'

或同等学历) :

aptitude search '~S ~i (!~Atesting ~Aunstable)'

它将搜索从任何存储库的不稳定档案中安装的软件包。您必须从默认存档中过滤掉软件包(在上面的示例中进行测试)。

如果要过滤从www.debian-multimedia.org/unstable安装的软件包:

aptitude search '~S ~i (!~Atesting ~Aunstable ?origin("Unofficial Multimedia Packages"))

编辑:Release存储库的文件中扣除“归档”,“来源”等。不幸的是,并非所有工具都能查看所有这些行,并且它们使用不同的语法。您可以找到这些文件/var/lib/apt/lists/*Release。或者只是键入apt-cache policy以获取概述。apt-cache更改了其输出格式:更高版本使用apt_preferences样式。

  • Suite:Archive:(旧名称!)
    • 才能搜索:?archive(___)~A___
    • 倾向格式: %t
    • apt_preferences: release a=___
    • Ubuntu的例子:natty-backportstrusty-securitystable
  • Origin:
    • 才能搜索:?origin(___)~O___
    • 倾向格式:n / a
    • apt_preferences: release o=___
    • Ubuntu的例子:CanonicalGoogle, Inc.LP-PPA-dockbar-mainUbuntu
  • 所有其他行
    • 能力:不适用

15

检查每个当前存储库的origin标签(例如o = Debian):

apt-cache policy | sed -n 's/.*o=\([^,]\+\).*/\1/p' | uniq

然后搜索来自(或不来自)特定来源的软件包:

aptitude search "?installed?origin(Debian)"
aptitude search "?installed?not(?origin(Debian))"

适合进行安全审核,因为它依赖于每个存储库提供自己的原始信息,但是它可能有助于解决多个存储库中存在的程序包的原始问题。


2
您的aptitude search模式不好。–他们像这样选择“列出安装了一个版本,而Debian中存在任何其他版本的软件包”或“已安装的某个版本,并且该软件包的至少一个版本在非Debian上可用”。–我们寻找的是“安装的版本来自Debian(或不是)。” 必须使用?narrow()或来完成?any-version()
罗伯特·西默

已确认。我是nemo-fileroller从安装的linuxmint,但也存在于中Debian。因此它出现在列表中,因为它已安装并且存在于Debian的某个位置。
Boldewyn 2014年

6

为了完整性:在Ubuntu系统上,您也可以使用Synaptic来完成此任务。在左列中,您可以按包的来源过滤包。


我试图这样做,并通过Google找到了此SU帖子,真不敢相信我忽略了Synaptic,谢谢!
David Claridge

@RobertSiemer可能会引起您的注意,没有足够答案的两天后,没有其他答案之前,我接受了它。我接受了它,因为它解决了我的问题。我也赞成所有以后的答案,但是,请您原谅,从未改变接受的状态。您还将在该站点的FAQ中注意到,我没有从此举中获得任何声誉提升,实际上,由于不接受别人的回答,我损失了2个代表。因此,请先退后一步,然后再公开判断某人的决定并重新考虑可能的原因。
Boldewyn 2014年

2

我发现了:

aptitude search "?origin (<repository>) ?installed"

您还可以在此处找到“能力搜索”支持的搜索词列表。


为什么需要运行此命令sudo?在我看来,这也可以不以超级用户身份运行而起作用。
Andre Holzner 2010年

它不需要与sudo一起运行
Kurtis Nusbaum 2012年

正如我在@Anonymous答案中评论的那样,这没有达到预期的效果。
罗伯特·西默

2

首先,在/ var / lib / apt / lists中找到感兴趣的存储库的适当文件。应该可以以编程方式执行此操作,但我不需要这样做。

以谷歌浏览器为例,请尝试以下操作:

SEARCH_PATTERN=dl.google.com_linux_chrome  # adjust to suit your needs

for PKG in $( grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages | sed 's/^Package: //' )
do
    if dpkg -s "${PKG}" 2> /dev/null 1> /dev/null
    then
        echo ${PKG}
    fi
done

我得到的输出:

google-chrome-stable

如果已安装软件包,则dpkg -s返回0,否则返回非零。为了将来参考,

grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages

原为

Package: google-chrome-beta
Package: google-chrome-stable
Package: google-chrome-unstable

...这会用吗?
罗伯特·西默

2
@RobertSiemer有什么关系?假设英语使用合理的命令,问题是如何查找使用aptitude安装的软件包的来源。不需要解决方案使用能力。
Auspex

@Auspex,我相信不是。–不用担心,几年前,我的英语水平已经超过“合理”水平。
罗伯特·西默

2
显然不是...
Auspex

2
@Auspex:你是想惹我吗?事实恰恰相反:问题是要寻求基于aptitude的解决方案,而不是针对使用aptitude安装的软件包。
罗伯特·西默

0

其他答案实际上是不正确的,因为to的参数?archive()是一个正则表达式。因此?archive(stable)匹配stableunstable。要仅排除,stable您需要锚定正则表达式模式:

aptitude search -F "%p %V %v %t" '?any-version(?installed ?not(?archive("^stable$")))'

要排除多个存储库:

aptitude search -F "%p %V %v %t" '?any-version(?installed ?not(?archive("^(xenial|xenial-updates)$")))'

另请注意,某些软件包属于多个存储库,例如xenial-security,xenial-updates?archive()分别针对每个存储库评估regex模式,因此?archive("^xenial-updates$")将匹配属于的任何软件包xenial-updates,即使它也属于其他存储库也是如此。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.