我曾经使用 Synaptic 查找本地软件包。这些软件包是本地安装的,但在当前活动存储库中没有完全匹配的软件包。正如这篇文章中解释的那样:Synaptic 中的“本地或过时”是什么意思。
我发现这个功能在调试时非常有用未满足的依赖关系问题。虽然我知道如何过时软件包列表,我找不到本地包裹的方法。
那么,是否有任何等效的命令行可以列出所有本地包?
笔记解释我使用的习语。
- 孤儿包裹:已安装自动作为依赖项,然后依赖项被删除。
- 过时的包裹:已安装但存储库中没有具有相同(名称、架构)的包。
- 当地的包裹:已安装但没有具有相同名称、架构、版本) 在存储库中。
所以我的意思不是所有已安装的软件包。
测试用例
- Synaptic → 菜单:设置 → 存储库 → 更新:启用不支持的更新(反向移植)(注意:我将其用作 PPA 示例)
- 重新加载软件包列表
- 搜索
debhelper
并选择它。菜单:软件包 → 强制版本...:从反向移植中选择并安装版本(通常是最高版本) - 菜单:设置 → 存储库 → 更新:禁用不支持的更新(反向移植)(注意:我将其用作 PPA 示例)
- 重新加载软件包列表
现在比较一下这两个列表:
Synaptic → SideBar:状态 → 已安装(本地且已过时)
aptitude search '~o'
user@user-vb:~$ aptitude search '~o' i A linux-headers-4.15.0-19 - Header files related to Linux kernel version 4.15.0 i A linux-headers-4.15.0-19-generic - Linux kernel headers for version 4.15.0 on 64 bit x86 SMP i A linux-image-4.15.0-19-generic - Signed kernel image generic i A linux-modules-4.15.0-19-generic - Linux kernel extra modules for version 4.15.0 on 64 bit x86 i A linux-modules-extra-4.15.0-19-generic - Linux kernel extra modules for version 4.15.0 on 64 bit x86 user@user-vb:~$
答案1
查找不是来自任何 source.list 或无法下载的已安装软件包。
$ aptitude search \
'?narrow(?or(!?origin(), ?obsolete), ?installed)'
或简写形式:
$ aptitude search '~S (!~O|~o) ~i'
?narrow
(过滤器,模式)
选择符合过滤器和模式的包。?or
(模式,模式)
匹配任意一个模式或者两者。?origin
(模式)
选择具有给定来源的包。?obsolete
匹配无法下载的已安装软件包。?installed
选择已安装的包。?not
(模式)或!
选择任何与模式不匹配的包。
答案2
apt list --installed
标签包的local
方式似乎与您的定义一致(请参阅我的答案在这里)你可以使用 ask、grep 等来过滤带有标签的包:
apt list --installed | awk -F/ '/local]/{print $1}'
你也可以使用Python APT API。
答案3
您apt-show-versions | grep -e 'No available version' -e 'newer than version'
将获得软件包列表:
- 没有任何仓库中的版本。
- 或者具有比 repo 中的版本更高的版本。
可能需要先安装sudo apt install apt-show-versions