我有一个通过安装的软件包列表apt
,并希望消除该列表中已存在的另一个软件包的依赖项的所有软件包:
https://gist.github.com/rubo77/bd9183fe2794467f482c
这些软件包有 400 多个,但其中大多数是由于该列表中的其他一些软件包而安装的。
我怎样才能缩小该列表并坚持该列表中主要的真正有趣的程序?
不知怎的,我必须使用这个:如何在apt中找到依赖于某个包的包?
或者是否有更简单的方法来区分有趣的程序和与主程序一起安装的小帮助程序包?
答案1
以下代码打印列表中某些包所$package_name
依赖的包的列表。您可以传递输入 fromdpkg -s
以使用已安装软件包列表中的数据,或传递输入以apt-cache show
使用可用软件包列表中的数据。此代码会跳过所有 or 依赖项 ( PACKAGE1 | PACKAGE2
),因为确定要引入哪一个依赖项会复杂得多,而且在实践中可能没有太大区别。
dpkg -s $package_names | awk -F '[:,] *' '
$1=="Depends" || $1=="Recommends" {
for (i=2; i<=NF; i++) {
if ($i ~ /\|/) continue;
sub(/ .*/, "", $i);
print $i
}
}'
如果要过滤文件Packages
,可以使用以下 awk 片段:
<Packages awk -v RS= -v packages="$package_names" '
BEGIN {split(packages, pa)}
$2 in pa
' | awk -F '[:,] *' '…'
现在,假设您有一个包含包列表的文本文件,您可以删除作为另一个包的依赖项的包,如下所示:
comm -23 <(sort packages.txt) <(apt-cache show $(cat packages.txt) |
awk -F '[:,] *' ' '…' |
sort)
这将输出输入列表中但未作为依赖项找到的包。
答案2
apt-get
还要aptitude
跟踪通过依赖项自动安装的软件包。至少在 aptitude 中,您可以列出所有未通过依赖项安装的软件包aptitude search '!~M'
。
不幸的是,这通常不计入系统安装时安装的软件包。还apt-get install
删除您作为参数传递给它的任何软件包的“自动安装”标志,因为它认为您希望显式安装该软件包,即使您只想以这种方式升级它。
看我的博客文章关于查找未标记为使用 aptitude 自动安装的库有关如何找出哪些软件包缺少“自动安装”标志的详细信息。
答案3
您可以使用apt-cache depends package
(对于依赖项)或apt-cache rdepends package
(对于反向依赖项)。