我正在寻找与此问题类似的东西:Zypper:如何显示某个存储库中的所有软件包?
由于我在Ubuntu上,因此我需要一个基于智能的解决方案:如何从某个存储库中获取已安装软件包的列表?
我正在寻找与此问题类似的东西:Zypper:如何显示某个存储库中的所有软件包?
由于我在Ubuntu上,因此我需要一个基于智能的解决方案:如何从某个存储库中获取已安装软件包的列表?
Answers:
使用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
。
在提交时,此软件包已更新:)
阅读了有关能力的信息页面并进行了十多次尝试后,我终于明白了:
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
release a=___
natty-backports
,trusty-security
,stable
Origin:
?origin(___)
或~O___
release o=___
Canonical
,Google, Inc.
,LP-PPA-dockbar-main
,Ubuntu
检查每个当前存储库的origin标签(例如o = Debian):
apt-cache policy | sed -n 's/.*o=\([^,]\+\).*/\1/p' | uniq
然后搜索来自(或不来自)特定来源的软件包:
aptitude search "?installed?origin(Debian)"
aptitude search "?installed?not(?origin(Debian))"
这不适合进行安全审核,因为它依赖于每个存储库提供自己的原始信息,但是它可能有助于解决多个存储库中存在的程序包的原始问题。
aptitude search
模式不好。–他们像这样选择“列出安装了一个版本,而Debian中存在任何其他版本的软件包”或“已安装的某个版本,并且该软件包的至少一个版本在非Debian上可用”。–我们寻找的是“安装的版本来自Debian(或不是)。” 必须使用?narrow()
或来完成?any-version()
。
nemo-fileroller
从安装的linuxmint
,但也存在于中Debian
。因此它出现在列表中,因为它已安装并且存在于Debian的某个位置。
为了完整性:在Ubuntu系统上,您也可以使用Synaptic来完成此任务。在左列中,您可以按包的来源过滤包。
sudo
?在我看来,这也可以不以超级用户身份运行而起作用。
首先,在/ 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
其他答案实际上是不正确的,因为to的参数?archive()
是一个正则表达式。因此?archive(stable)
匹配stable
和unstable
。要仅排除,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
,即使它也属于其他存储库也是如此。
?any-version()
,因为~narrow(pat1, pat2)
和一样?any-version(pat1 pat2)
,它?any-version(pat1 pat2 pat3)
看起来也不笨。