Алексей Федорчук
При работе с пакетами довольно часто возникает задача — определить, какие же файлы входят в состав того или иного пакета. В deb based системах обычно предлагается решать её или с помощью самого низкоуровнего средства — утилиты dpkg
, или, напротив, посредством графического фронт-энда для управления пакетами, Synaptic’а. Оба они с этим делом справляются, при условии, что «препарируемый» пакет, как минимум, скачан на локальную машину, а при использовании Synaptic’а — ещё и установлен в системе.
Однако нередко состав пакета и хочется посмотреть для того, чтобы решить, стоит ли его скачивать, а тем более — устанавливать. И тут на помощь приходит утилита apt-file
. Она входит в состав одноимённого пакета, который в базовой инсталляции с mini.iso
отсутствует — здесь его потребуется установить самостоятельно:
$ sudo apt install apt-file
После этого первым делом надо запустить команду
$ sudo apt-file update
которая скачает Contents-файлы всех репозиториев, описанных в файле /etc/apt/sources.list
и поместит их в каталог /var/cache/apt/apt-file
примерно в таком виде:
ru.archive.ubuntu.com_ubuntu_dists_wily-backports_Contents-amd64.gz ru.archive.ubuntu.com_ubuntu_dists_wily_Contents-amd64.gz ru.archive.ubuntu.com_ubuntu_dists_wily-updates_Contents-amd64.gz security.ubuntu.com_ubuntu_dists_wily-security_Contents-amd64.gz
Это — та база, с которой в дальнейшем будет работать утилита apt-file
. Очевидно, что процедуру её апдейта не худо повторять после подключения каждого дополнительного репозитория. Правда, репозитории, не содержащие Contents-файла (а таковых большинство среди мелких PPA-репозиториев), всё равно будут проигнорированы.
Для определения состава пакета служит внутренняя команда list
или её псевдоним show
. В качестве аргумента указывается так называемый шаблон (pattern), который может принимать несколько значений (подробности см. в man apt-file
), в том числе и просто имя пакета, например:
$ apt-file list apt-file [~] apt-file: /etc/apt/apt-file.conf apt-file: /etc/bash_completion.d/apt-file apt-file: /usr/bin/apt-file apt-file: /usr/bin/diffindex-download apt-file: /usr/bin/diffindex-rred apt-file: /usr/share/apt-file/apt-file-update.update-notifier apt-file: /usr/share/apt-file/do-apt-file-update apt-file: /usr/share/apt-file/is-cache-empty apt-file: /usr/share/doc/apt-file/README apt-file: /usr/share/doc/apt-file/changelog.gz apt-file: /usr/share/doc/apt-file/copyright apt-file: /usr/share/man/man1/apt-file.1.gz apt-file: /usr/share/man/man1/diffindex-download.1.gz apt-file: /usr/share/man/man1/diffindex-rred.1.gz
А вот в случае с пакетом apt
вывод той же команды будет жутковатым, потому что в команде
$ apt-file list apt
последовательность apt
будет воспринята как шаблон, который можно расширить не только до apt-build
или synaptic
, но даже до adapter
. Для предотвращения этого безобразия предусмотрена опция --fixed-string
, или просто -F
, запрещающая развёртывание шаблона. То есть команда
$ apt-file -F list apt
обеспечит вывод списка файлов только пакета apt
и никакого другого. Если отфильтровать его сквозь grep
по ключевому слову, например, bin
, можно поимённо узнать все входящие в него утилиты:
apt: /usr/bin/apt apt: /usr/bin/apt-cache apt: /usr/bin/apt-cdrom apt: /usr/bin/apt-config apt: /usr/bin/apt-get apt: /usr/bin/apt-key apt: /usr/bin/apt-mark
Об одной из них, apt-mark
, уже была речь, разговор об остальных ещё предстоит, так что запомним этот список на будущее. А сейчас перейдём к рассмотрению других возможностей утилиты apt-file
.
В жизни случается и такое, что требуется установить, в какой пакет входит файл с неким именем. Это можно сделать с помощью утилиты dpkg
:
$ dpkg -S filename
Но, опять-таки, только в случае, что искомый пакет установлен в системе. Однако в том-то и дело, что обычно как раз для отыскания пакета не установленного — такая ситуация описана в очерке Ubuntu и Cinnamon: рецепт доводки. Где дано и решение задачи — использование apt-file
с внутренней командой search
(или её псевдонимом find
):
$ apt-file -l find add-apt-repository software-properties-common
Обращаю внимание на опцию -l
: как явствует из её «длинного» имени, --package-only
, она обеспечивает присутствие в выводе только имеми пакета, без неё вывод был бы перегружен лишней информацией вроде полных путей к исполняемому файлу, man-странице и вообще всему, что совпадает с шаблоном аргумента.
Утилита apt-file
имеет и другие опции, среди которых:
--ignore-case
(сокращённо-i
), предписывающая игнорировать регистр символов;--regexp
, она же-x
, позволяющая использовать в шаблоне регулярные выражения;--
обозначающая конец опций; она необходима, если шаблон начинается с дефиса.
За остальными опциями — как обычно, к тёте Мане. От которой можно узнать и о последней внутренней команде apt-file
, purge
, действие которой противоположно update
— она удаляет локальные Contents-файлы, что может потребоваться при переключении на другие репозитории.
В приведённом ранее выводе команды
$ apt-file list apt-file
можно видеть, что в пакет apt-file
входит ещё две утилиты — diffindex-download
и diffindex-rred
. Они выступают в качестве средств обеспечения «титульной» утилиты, позволяя при последующих апдейтах скачивать лишь патчи удалённых Contents-файлов и совмещать их с локальными. Самостоятельного применения им я не придумал.