Как определить, является ли пакет метапакетом из командной строки?

14

Как определить, является ли пакет метапакетом из командной строки, возможно, через apt-get, aptitude или apt-cache?

Я пытался:

apt-cache show texlive-full
apt-cache showpkg texlive-full

но единственный способ, которым я могу сказать этот пакет, является мета, читая поле "en-description".

Есть ли более автоматический способ сделать это, который даст мне ответ «да» или «нет», или, по крайней мере, есть поле, такое как «en-description», посвященное этому?

Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
источник
1
Помимо того, что этот вопрос и ответы довольно интересны, почему вы хотите это знать?
Джо
1
Я устанавливал вещи с помощью apt-get и заметил, что если я устанавливаю метапакет (texlive-full), он устанавливает нужные мне зависимости, но если я удаляю метапакет, зависимости остаются там (apt-get install texlive-full, apt-get purge texlive-full; apt-get autoremove). Тогда я обнаружил, что это касается только метапакетов brainstorm.ubuntu.com/idea/17785 . aptitude, с другой стороны, удаляет ненужные зависимости из метапакета.
Сиро Сантилли 新疆 12 中心 法轮功 六四 事件

Ответы:

7

Формального определения метапакета не существует. Неформальное определение заключается в том, что метапакет предназначен для установки только для его зависимостей и не содержит собственного полезного файла.

Вы можете определить метапакет как пакет, который не содержит файла. Нет способа определить это из базы данных пакета. Вы можете использовать файловую базу данных и проверить, что пакет содержит только каталоги (многие такие пакеты содержат несколько каталогов). Фактически, большинство метапакетов содержат несколько файлов /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\$"
Жиль "ТАК - перестань быть злым"
источник
спасибо за эти методы: я не знал о debtags! Кроме того, я где-то читал, что когда вы устанавливаете метапакет с помощью apt-get, это точно так же, как если бы вы устанавливали каждую зависимость вручную по отдельности, что означает, что удаление исходного пакета не приведет к немедленному удалению его зависимостей, в то время как для обычных пакетов, удаление будет удалить установленные зависимости. Это правда? Если да, то как apt-get может определить разницу? Это тоже можно использовать ... (также кажется, что aptitude не заботится о том, его мета или нет, правда ли это?)
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
@cirosantilli Функция автоматического удаления зависимостей не связана с метапакетами. Это происходит потому, что если вы не запрашиваете пакет явно, он помечается как автоматически установленный , а пакет, помеченный как автоматически установленный, удаляется, если не установлен пакет, который зависит от него. См apt-get autoremove, aptitude (un)markauto, то Mкоманда в профпригодности интерактивного интерфейса.
Жиль "ТАК - перестать быть злым"
@cirosantilli Подумав, интересно, вы имели в виду виртуальные пакеты, а не метапакеты? Смотрите мой обновленный ответ.
Жиль "ТАК - перестань быть злым"
Я действительно не знал о виртуальных пакетах, но я думаю, что texlive-full не виртуален, так как apt-cache show texlive-full показывает обычные результаты. Несмотря на это, после того, как я сделал apt-get install texlive-full, apt-get purge texlive-full; apt-get autoremoveне удалил все установленные зависимости. Я где-то читал, что это потому, что texlive-full был метапакетом, и что это было нормальное поведение метапакета, но, возможно, это было неправильно. С другой стороны, aptitude, похоже, удалял автоматически установленные зависимости.
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
2

Вы можете попробовать войти

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.


источник