如何从命令行确定一个软件包是否为元软件包?

如何通过命令行(可能是apt-get、aptitude或apt-cache)确定一个软件包是否为元软件包?
我已经尝试过:
apt-cache show texlive-full
apt-cache showpkg texlive-full

但是我唯一能够判断这个包是否是元数据的方法就是通过阅读“en-description”字段。
有没有更自动化的方法来做到这一点,可以给我一个是/否的回答,或者至少有一个专门用于此目的的字段,比如“en-description”?

1除了这个问题和答案非常有趣之外,你为什么想知道这个呢? - Joe
1我正在使用apt-get安装软件,并注意到如果我安装一个元包(texlive-full),它会安装我想要的依赖项,但是如果我卸载这个元包,依赖项仍然保留(apt-get install texlive-full,apt-get purge texlive-full; apt-get autoremove)。然后我发现,这只适用于元包,而aptitude则会从元包中删除不必要的依赖项。 - Ciro Santilli OurBigBook.com
ismetap () { if [ ! -z "$(apt-cache show $1|grep Section|grep meta)" ]; then echo 是 ; else echo 否 ; fi }应该可以工作,但不能保证对所有元包都有效,只需按照以下方式调用它即可。 ismetap 包名这是一个Bash函数,您可以将其复制粘贴到终端中或将其放入Bash脚本中。 - manoflinux
2个回答

没有关于元包的正式定义。非正式定义是,元包只是为了安装其依赖项而存在,并且不包含任何有用的文件。
您可以将元包定义为不包含任何文件的软件包。无法从软件包数据库中确定这一点。您可以使用文件数据库并检查软件包是否仅包含目录(许多此类软件包包含几个目录)。实际上,大多数元包在/usr/share/doc/<package name>中包含一些文件:一个copyright文件,一个更改日志,有时还有一些其他文件。以下是一个近似定义,将元包定义为仅包含/usr/share/doc/<some directory>中的文件(而不是该目录的子目录)和前导目录。
if ! apt-file -F list $package | grep -qvE '^/(usr(/share(/doc(/[^/]*(/[^/]*)?)?)?)?)?$'; then
  echo "$package looks like a metapackage"
fi

另一种方法是寻找带有 package tagdebtags 的软件包。有几个标签通常用于元软件包。
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\$"

谢谢这些方法:我之前不知道debtags!另外,我在某个地方读到,当你使用apt-get安装一个元包时,它就像你逐个手动安装每个依赖项一样,这意味着删除原始包不会立即删除其依赖项,而对于普通包来说,删除将删除已安装的依赖项。这是真的吗?如果是这样,apt-get如何区分呢?这也可能被利用...(似乎aptitude无论是不是元包都不关心,这是真的吗?) - Ciro Santilli OurBigBook.com
@cirosantilli 自动删除依赖项的功能与元包无关。这是因为如果您没有显式请求一个软件包,它将被标记为“自动安装”,而标记为自动安装的软件包将在没有依赖于它的软件包安装时被删除。请参阅apt-get autoremoveaptitude (un)markauto,以及aptitude交互界面中的M命令。 - Gilles 'SO- stop being evil'
@cirosantilli 经过思考,我想知道你是否考虑的是虚拟包而不是元包?请查看我的更新答案。 - Gilles 'SO- stop being evil'
我真的不知道虚拟包的存在,但我认为texlive-full并不是虚拟包,因为apt-cache show texlive-full显示了正常的结果。即便如此,在我执行了apt-get install texlive-full之后,apt-get purge texlive-full; apt-get autoremove并没有移除所有已安装的依赖项。我在某个地方读到过这是因为texlive-full是一个元包,而这是元包的正常行为,但也许这是错误的。另一方面,aptitude似乎可以很好地移除自动安装的依赖项。 - Ciro Santilli OurBigBook.com

你可以尝试输入
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能做到的最好的了,但它应该能快速定位到大部分你想要找到的元包。如果它没有完全找到你所寻找的一切,最简单的方法就是在Synaptic的元包部分查找。