Управление deb-пакетами. Утилиты семейства APT: apt-file

Алексей Федорчук

При работе с пакетами довольно часто возникает задача — определить, какие же файлы входят в состав того или иного пакета. В 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-файлов и совмещать их с локальными. Самостоятельного применения им я не придумал.

Добавить комментарий