没有关于元包的正式定义。非正式定义是,元包只是为了安装其依赖项而存在,并且不包含任何有用的文件。
您可以将元包定义为不包含任何文件的软件包。无法从软件包数据库中确定这一点。您可以使用
文件数据库并检查软件包是否仅包含目录(许多此类软件包包含几个目录)。实际上,大多数元包在
/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 tag 和
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\$"