Как определить, является ли пакет метапакетом из командной строки?
Как я могу определить, является ли пакет метапакетом из командной строки, возможно, через apt-get, aptitude или apt-cache?
Я пытался:
apt-cache show texlive-full
apt-cache showpkg texlive-full
но единственный способ, которым я могу сказать этот пакет, является мета, читая поле "en-description".
Есть ли более автоматический способ сделать это, который даст мне ответ "да" или "нет", или, по крайней мере, будет поле, такое как "en-description", посвященное этому?
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
Другой подход заключается в поиске тега пакета с 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\$"
Вы можете попробовать войти
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
,