Формального определения метапакета не существует. Неформальное определение заключается в том, что метапакет предназначен для установки только для его зависимостей и не содержит собственного полезного файла.
Вы можете определить метапакет как пакет, который не содержит файла. Нет способа определить это из базы данных пакета. Вы можете использовать файловую базу данных и проверить, что пакет содержит только каталоги (многие такие пакеты содержат несколько каталогов). Фактически, большинство метапакетов содержат несколько файлов /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\$"