如何从命令行确定包是否为元包?


14

如何通过命令行(可能是通过apt-get,aptitude或apt-cache)确定软件包是否为元软件包?

我试过了:

apt-cache show texlive-full
apt-cache showpkg texlive-full

但我可以告诉此程序包的唯一方法是meta,方法是阅读“ en-description”字段。

是否有一种更自动的方式来执行此操作,是否可以回答“是/否”,或者至少具有诸如“ en-description”之类的字段专用于此?


1
除了这个问题和答案很有趣之外,您为什么还想知道这一点?
2012年

1
我当时在用apt-get安装东西,并注意到如果我安装了metapackage(texlive-full),它会安装我想要的依赖项,但是如果我卸载了metapackage,则依赖项会保留在那儿(apt-get install texlive-full, apt-get清除texlive-full; apt-get autoremove)。然后我发现只有元数据包brainstorm.ubuntu.com/idea/17785就是这种情况。另一方面,aptitude确实从元包中删除了不必要的依赖项。
Ciro Santilli新疆改造中心法轮功六四事件

Answers:


7

没有元包的正式定义。非正式的定义是,metapackage是一个仅出于依赖关系而安装的软件包,不包含其自己的有用文件。

您可以将元包定义为不包含文件的包。无法从软件包数据库中确定这一点。您可以使用文件数据库并检查该软件包仅包含目录(许多此类软件包包含一些目录)。实际上,大多数元软件包在以下位置包含一些文件/usr/share/doc/<package name>copyright文件,变更日志,有时还包含更多文件。这是一个近似的定义,将metapackage定义为仅包含/usr/share/doc/<some directory>(而不是在其子目录中)和前导目录中的文件:

if ! apt-file -F list $package | grep -qvE '^/(usr(/share(/doc(/[^/]*(/[^/]*)?)?)?)?)?$'; then
  echo "$package looks like a metapackage"
fi

另一种方法是寻找一个包装标签debtags。元包上通常使用几种标签。

debtags tag ls $package | grep -x -e 'role::metapackage' -e 'role::dummy' -e 'special::meta'

另一种方法是寻找尺寸小的包装。每个目录计数为4 kB,因此在选择阈值时也要进行计划(同样,这是一个近似值)。

aptitude -F '%I %p' search "~n^$package\$"

经过反思,我想知道您是指虚拟软件包,而不是元软件包。虚拟软件包实际上不是软件包,而是Provides:字段中使用的软件包名称。您可以使用列出它们aptitude search '~v'apt-cache show在一个显示器上运行“由于纯虚拟,因此无法从软件包'zcav'中选择版本”。运行aptitude show列出提供它的软件包。显示虚拟软件包的一种简便方法是apt-cache:使用此方法为非虚拟软件包打印一行,并为一个虚拟软件包打印多行(每个提供程序一行)-即使有一个提供程序,您也可以判断该软件包是否是虚拟的因为提供者的名称不同。

apt-cache -n search "^$package\$"

感谢那些方法:我不知道关于债务问题!另外,我在某处读到,当您使用apt-get安装元软件包时,就好像您是手动手动安装每个依赖项一样,这意味着删除原始软件包不会立即删除其依赖项,而对于普通软件包,删除将会删除已安装的依赖项。这是真的?如果是这样,apt-get怎么能分辨出差异?这也可以被利用...(似乎能力也不关心它的元与否,对吗?)
Ciro Santilli新疆改造中心法轮功六四事件

@cirosantilli自动删除依赖项的功能与元包无关。发生这种情况的原因是,如果您未明确请求软件包,则将其标记为自动安装,如果未安装任何依赖于该软件包的软件包,则将其标记为自动安装。参见apt-get autoremove,aptitude交互界面中aptitude (un)markautoM命令。
吉尔斯(Gillles)“所以-别再邪恶了”

@cirosantilli经过反思,我想知道您想的是虚拟软件包,而不是元软件包吗?看到我更新的答案。
吉尔(Gilles)“所以,别再邪恶了”,

我真的不了解虚拟软件包,但是我认为texlive-full不是虚拟的,因为apt-cache show texlive-full显示了通常的结果。即使这样,在完成操作后apt-get install texlive-fullapt-get purge texlive-full; apt-get autoremove也没有删除所有已安装的依赖项。我在某处读到这是因为texlive-full是一个metapackage,这是metapackage的正常行为,但是也许这是错误的。另一方面,aptitude似乎可以删除自动安装的依赖项。
Ciro Santilli新疆改造中心法轮功六四事件2012年

2

您可以尝试输入

apt-cache search 'metapackage | meta-package'

这将给您很长的清单,然后用来grep显示所有与科学相关的元数据包,

apt-cache search 'metapackage | meta-package' | grep -i science

这将返回一个长列表(我在这里缩短了)

science-astronomy - Debian Science Astronomy packages
science-astronomy-dev - Debian Science Astronomy-dev packages
science-biology - Debian Science Biology packages
science-chemistry - Debian Science Chemistry packages
science-dataacquisition - Debian Science data acquisition packages
science-dataacquisition-dev - Debian Science data acquisition development packages
science-distributedcomputing - Debian Science Distributed Computing packages
science-electronics - Debian Science Electronics packages
science-electrophysiology - Debian Science packages for Electrophysiology
science-engineering - Debian Science Engineering packages
science-engineering-dev - Debian Science Engineering-dev packages
science-geography - Debian Science Geography packages
science-highenergy-physics - Debian Science High Energy Physics packages

您可以使用多种科学替代方法,例如KDE查找所有KDE元包。

这可能是您可以做的最好的事情apt-cache,但是它应该可以快速找到要查找的大多数metapackage。如果找不到您要查找的所有内容,那么最简单的方法是在中的metapackage部分中查找Synaptic

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.