有许多方法可以使用apt
手动显示包,如:
apt-mark showmanual
但有时产出过高。例如,如果用户手动安装包foo
:
apt-get install foo
...and foo
依赖于bar
和baz
,然后apt-mark showmanual
将输出:
bar
baz
foo
我们如何只列出顶级手动安装的包(即foo
),而不依赖于它们(即不是baz
,也不是bar
)?
下面的代码似乎可以工作,但是GNU parallel
调用apt-rdepends
几百次太慢了(4个核心CPU需要三个小时):
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
发布于 2017-06-07 06:01:06
这可以使用来完成。您在apt-mark showmanual
中看到的包正是apt.cache.Cache()
中的包,其中is_installed
为true,is_auto_installed
为false。但是,处理依赖关系更容易:
#! /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))
即使在这里也列出了一些我不希望看到的包(init
,grep
?!)。
发布于 2021-04-15 12:38:14
请参阅关于Askubuntu的答案,它使用apt-mark showmanual
与/var/log/installer/initial-status.gz
内容的比较:
comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)
这正好给了我自Ubuntu新安装以来手动添加的软件包。
https://unix.stackexchange.com/questions/369136
复制相似问题