#!/usr/bin/env python3
#
# This lists all packages not from Ubuntu's (e.g. main/universe) repositories
# To use, simply download/copy into a .py file and run with:
# python3 list_non_ubuntu.py
#
# If you receive an import error, you may need to install python3-apt first with e.g.
# sudo apt install python3-apt
# but this is often not necessary
import apt
cache = apt.Cache()
package_count = 0
for package in cache:
if (
package.is_installed
and package.candidate.origins[0].origin != "Ubuntu"
):
package_origin = package.candidate.origins[0]
print(
package.name,
# See https://apt-team.pages.debian.net/python-apt/library/apt.package.html#apt.package.Origin
# for further details on the meanings of the below
package_origin.origin, # The Origin, as set in the Release file
package_origin.archive, # The archive (eg. Ubuntu release name)
package_origin.component, # The component (eg. main/universe)
package_origin.site, # The hostname of the site.
# package_origin.label, # The Label, as set in the Release file
# package_origin.trusted, # Origin trusted (Release file signed by key in apt keyring)
)
package_count += 1
print(package_count, "packages not from Ubuntu")
$ python3 list_non_ubuntu.py
azure-cli azure-cli focal focal main packages.microsoft.com
google-chrome-stable Google LLC stable main dl.google.com
[...]
signal-desktop . xenial xenial main updates.signal.org
8 packages not from Ubuntu
似乎没有关于已安装包的来源的记录。
如果您可以从下载同名包的位置获取位置,则可以通过
apt-cache policy
. 以下(相当丑陋的)脚本对我有用:请注意,它非常脆弱,因为它对 的输出做出假设
apt-cache policy
,这可能会因版本而异......打开 Synaptic Package Manager 并单击左侧边栏底部的“Origin”按钮。它将列出您的来源。选择一个来源以查看可用/已安装的软件包。
展开 Ubuntu 软件中心中的“已安装软件”项。您将看到已启用的所有不同存储库的列表。单击 repo 将显示您从每个安装的包。
此脚本列出了 PPA 中已安装和可用的软件包:
我应用了这个。
顺便说一句,至于从使用中删除 PPA,请使用 ppa-purge 程序;我在这里创建了它的改进版本。
在 Quantal (12.10) 下,需要去除原点行中的空格。
如果你的系统没有Wayland/X服务器(比如树莓派),andrewsomething和lovelinux的答案就不能用了。jarno的回答将用例仅限于 PPA,尽管这个问题是普遍感兴趣的。来自Riccardo Murri和Graham Dunn的脚本由于重复
apt-cache policy
调用(例如大约 10 分钟的运行时间)而非常缓慢。所以这是我的电话解决外壳上的一般情况要快得多(比如运行时间不到 10 秒)
apt list --installed
获取所有已安装软件包的列表,忽略 apt 关于未来可能的格式更改的消息,2> /dev/null
并仅提取软件包名称,cut
使用/
作为分隔符-d/
并返回第一个字段-f1
。然后,
apt-cache policy
用于获取有关所有包的更多信息。这可以用 xargs 执行,正如apt-cache
预期的那样,它的输入是命令行参数。由于这是剩余的性能关键部分,因此使用parallel
包parallel
中的 GNU 来并行运行多个apt-cache
进程,查找 200 个包,每个包使用-n200
. 请注意,xargs 也可以并行运行多个命令,但会在换行符上同步输出,这通常在这里是不正确的。最后,
apt-cache
的输出使用rg
from 包解析,ripgrep
这是一个非常快速且支持多行的grep
后继程序,-U
允许输出两个正则表达式捕获组-or '$1 $2'
。正则表达式用 捕获包名^(\S+)
,跳到用 标记已安装存储库的最后一个星[\s\S]+?\*
号,然后用 跳过三个单词,(?:\S+\s+){3}
最后用 捕获存储库(\S+)
。像这个 Python 脚本这样的东西应该会找到您机器上安装的所有非 Ubuntu 软件包:
在我的机器上,这需要不到 5 秒的时间来运行,而当前的最佳答案(来自 Riccardo/Pablo)则需要超过 8 分钟。输出格式为:
如果您只想要来自特定 ppa 的内容,则可以
and package.candidate.origins[0].site == "[ppa-domain.com]"
在之后添加一个附加内容。.origin != "Ubuntu"