首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >列出没有依赖项的顶级手动安装包

列出没有依赖项的顶级手动安装包
EN

Unix & Linux用户
提问于 2017-06-04 13:58:57
回答 2查看 9.6K关注 0票数 20

有许多方法可以使用apt手动显示包,如:

代码语言:javascript
运行
复制
apt-mark showmanual

但有时产出过高。例如,如果用户手动安装包foo

代码语言:javascript
运行
复制
apt-get install foo

...and foo依赖于barbaz,然后apt-mark showmanual将输出:

代码语言:javascript
运行
复制
bar
baz
foo

我们如何只列出顶级手动安装的包(即foo),而不依赖于它们(即不是baz,也不是bar)?

下面的代码似乎可以工作,但是GNU parallel调用apt-rdepends几百次太慢了(4个核心CPU需要三个小时):

代码语言:javascript
运行
复制
apt-mark showmanual | 
tee /tmp/foo | 
parallel "apt-rdepends -f Depends,PreDepends,Suggests,Recommends {} |
          tail +2" 2> /dev/null | 
tr -s ' ' '\n' | 
grep -v '[():]' | 
sort -Vu | 
grep -wv -f - /tmp/foo
EN

回答 2

Unix & Linux用户

发布于 2017-06-07 06:01:06

这可以使用来完成。您在apt-mark showmanual中看到的包正是apt.cache.Cache()中的包,其中is_installed为true,is_auto_installed为false。但是,处理依赖关系更容易:

代码语言:javascript
运行
复制
#! /usr/bin/env python3

from apt import cache

manual = set(pkg for pkg in cache.Cache() if pkg.is_installed and not pkg.is_auto_installed)
depends = set(dep_pkg.name for pkg in manual for dep in pkg.installed.get_dependencies('PreDepends', 'Depends', 'Recommends') for dep_pkg in dep)

print('\n'.join(pkg.name for pkg in manual if pkg.name not in depends))

即使在这里也列出了一些我不希望看到的包(initgrep?!)。

票数 14
EN

Unix & Linux用户

发布于 2021-04-15 12:38:14

请参阅关于Askubuntu的答案,它使用apt-mark showmanual/var/log/installer/initial-status.gz内容的比较:

代码语言:javascript
运行
复制
comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

这正好给了我自Ubuntu新安装以来手动添加的软件包。

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/369136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档