Формального определения метапакета не существует. Неформальное определение заключается в том, что метапакет предназначен для установки только для его зависимостей и не содержит собственного полезного файла.
Вы можете определить метапакет как пакет, который не содержит файла. Нет способа определить это из базы данных пакета. Вы можете использовать файловую базу данных и проверить, что пакет содержит только каталоги (многие такие пакеты содержат несколько каталогов). Фактически, большинство метапакетов содержат несколько файлов /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
Другой подход заключается в поиске тега пакета с помощью debtags. Есть несколько тегов, которые обычно используются в метапакетах.
debtags tag ls $package | grep -x -e 'role::metapackage' -e 'role::dummy' -e 'special::meta'
Другой подход заключается в поиске пакетов небольшого размера. Каждый каталог считается 4 КБ, поэтому планируйте соответственно при выборе порога (опять же, это приблизительное значение).
aptitude -F '%I %p' search "~n^$package\$"
Подумав , интересно, вы имеете в виду виртуальные пакеты, а не метапакеты? Виртуальные пакеты на самом деле не пакеты, а имена пакетов, используемые в Provides:полях. Вы можете перечислить их с aptitude search '~v'. При запуске apt-cache showна одном экране отображается сообщение «Невозможно выбрать версии из пакета« zcav », поскольку он является чисто виртуальным». Запуск aptitude showперечисляет пакеты, которые предоставляют его. Удобный способ показать виртуальные пакеты с помощью apt-cache: это печатает одну строку для не виртуального пакета и потенциально несколько строк (по одной для каждого поставщика) для виртуального пакета - вы можете сказать, является ли пакет виртуальным, даже если есть один поставщик потому что имя провайдера другое.
apt-cache -n search "^$package\$"