Debian で未インストールパッケージの内容を検索できる apt-file

Debian GNU/Linux Jessie に、システムにインストールされていないパッケージの情報を検索する apt-file というパッケージをインストールしました。自分用の備忘録を兼ねて書き留めておきます。

なお、記事の内容については動作確認の結果を反映していますが、内容の正確性は保証できません。あらかじめご了承ください。



apt-file の機能

システムにインストールされているパッケージを対象にして特定のパッケージの情報を確認する場合は、以下のように dpkg コマンドを使用するとそのパッケージでインストールされたファイル、ディレクトリ等を確認できます。

$ dpkg -L apt | sort
/.
/etc
/etc/apt
/etc/apt/apt.conf.d
/etc/apt/apt.conf.d/01autoremove
/etc/apt/preferences.d
/etc/apt/sources.list.d
以下省略

また、設定ファイル /etc/host.conf をインストールしたパッケージを検索するには、同じく dpkg コマンドを使い、以下のように調べることが出来ます。

$ dpkg -S /etc/host.conf
base-files: /etc/host.conf

しかし、この dpkg で確認できるのは「現在システムにインストールされているパッケージ」のみが対象で、まだインストールされていなパッケージの情報を確認することは出来ません。

なお、ここで言う「インストールされるファイル、作成されるディレクトリ等」は、Debian のパッケージファイル packages.deb に含まれているファイルのことを指し、パッケージをインストールする際に、スクリプトで自動生成される設定ファイルやディレクトリは含まれません。

今回インストールした apt-file は、「まだインストールされていなパッケージ」についても、インストールされるファイル、作成されるディレクトリ等を調べることが出来ます。

apt-file のインストール

apt-file パッケージのインストールは apt-get コマンドを使用し、パッケージ名に apt-file を指定します。

# apt-get install apt-file
以下のパッケージが新たにインストールされます:
  apt-file curl libapt-pkg-perl libconfig-file-perl libcurl3 liblist-moreutils-perl libregexp-assemble-perl

インストールされたコマンドやマニュアルページ等

apt-file 以外にも幾つかのパッケージがインストールされましたが、apt-file パッケージでインストールされた設定ファイル、コマンド、マニュアルページ等を確認してみます。

以下のように Debian パッケージマネージャのコマンドである dpkg-L コマンドを指定すると、確認できます。

$ dpkg -L apt-file | sort | more
/.
/etc
/etc/apt
/etc/apt/apt-file.conf
/etc/bash_completion.d
/etc/bash_completion.d/apt-file
以下省略
apt-file の設定ファイル
/etc/apt/apt-file.conf
コマンド
/usr/bin/apt-file
/usr/bin/diffindex-download
/usr/bin/diffindex-rred
マニュアルページ
apt-file(1) - APT package searching utility - command-line interface
diffindex-download(1) - Download utility for Debian Contents files
diffindex-rred(1) - Restricted restricted ed

キャッシュ用ディレクトリ

apt-file のインストールが完了すると、システム用のキャッシュディレクトリ /var/cache/apt/apt-file/ が作成されていますが、ディレクトリにはファイルはありません。root 権限またはユーザー権限でコマンド apt-file を実行した時に、以下のいずれかのディレクトリにキャッシュ用のファイルが作成されます。

root 権限で apt-file を実行する場合
/var/cache/apt/apt-file/
ユーザー権限で apt-file を実行する場合
~/.cache/apt-file/

apt-file のキャッシュファイル作成と更新

apt-file のインストールが終了した時点では apt-file のキャッシュファイルが作成されていませんので、まず最初にキャッシュファイルを作成する必要があります。ただし、前項にも書いたように、キャッシュファイル作成と更新を行う際の権限をどちらか一方にしたほうが、無駄なファイルを作成しなくて済みます。

root 権限で行う場合

root 権限でキャッシュファイル作成と更新を行うと、/var/cache/apt/apt-file/ にキャッシュファイルが生成されます。

# apt-file update

ユーザー権限で行う場合

ユーザー権限でキャッシュファイル作成と更新を行うと、初回実行時にディレクトリ ~/.cache/apt-file/ が作成され、~/.cache/apt-file/ にキャッシュファイルが生成されます。

なお、キャッシュファイル作成と更新には Debian が動いている環境によっては、思っている以上に時間がかかる場合があります。

$ apt-file update
apt-file is now using the user's cache directory.
If you want to switch back to the system-wide cache directory,
 run 'apt-file purge'
Downloading complete file http://ftp.jp.debian.org/debian/dists/jessie/main/Contents-amd64.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 26.1M  100 26.1M    0     0   569k      0  0:00:46  0:00:46 --:--:--  932k
以下省略

ここで作成および更新されるキャッシュファイルは、APT の設定ファイルである /etc/apt/sources.list の情報を元にデータをダウンロードしてキャッシュファイルを生成します。

以降は、時々 apt-file update を実行すると、キャッシュファイルのデータが更新されます。Debian の安定版でパッケージに含まれるファイルが削除されたり追加されることは殆ど無いと思いますので、データを更新するタイミングは、「思い出した時」で良いのではないかと思います。

コマンド apt-file の使用方法

apt-file の使い方は、他の apt のコマンドとほぼ同じで、以下の様なアクションとオプションがあります。

書式

  • apt-file [ options ] [ action ] [ pattern ]
  • apt-file -f [ options ] search [ file ... ]
  • apt-file -D [ options ] search [ binary-packet.deb ... ]

オプション

オプションのうち、使用頻度が高そうなものを列挙します。

-f|--from-file
指定されたファイル(複数可)から、1 行に 1 つずつからパターンを読みます。
ファイル名に - を指定した場合は、標準入力です。また、ファイルを指定しない場合は、リストは標準入力から読み込まれます。
-i|--ignore-case
パターンを検索するとき、大文字と小文字を区別しません。
-l|--package-only
パッケージ名のみを表示し、ファイル名は表示されません。
-x|--regexp
正規表現として perl のパターンを扱います。このオプションを指定しないと、検索する文字列はただの文字列として扱われます。
apt-file のマニュアルページによると、このオプションで使用する正規表現のメタキャラクタは perlreref(1) に準じているそうです。perlreref(1)perl-docperl-doc-html パッケージに含まれているのですが、apt-file の正規表現に記載したように、オンラインのマニュアルで確認したほうが分かりやすいのではないかと思います。
-v|--verbose
冗長モードで apt-file を実行します。
-h|--help
ヘルプ画面を表示します。

アクション

アクションは、検索を実行するためのコマンドです。

update
コマンド curl または wget を使用し、/etc/apt/sources.list に書かれている場所からデータファイルをダウンロードします。
search|findpattern
パッケージを検索するコマンドです。
パターン ‘pattern‘ を含むすべてのパッケージのリストが返されます。ファイル名のみではなく、ディレクトリ名も検索します。
list|showpattern
パターン ‘pattern‘ にマッチするパッケージの内容を表示します。dpkg -L コマンドに非常に近いです。
purge
キャッシュディレクトリからすべてのキャッシュファイル Contents-* を削除します。

apt-file の正規表現

前項のとおり、apt-filePerl の用法に従った正規表現が利用できます。apt-file のマニュアルページに

Treat pattern as a (perl) regular expression.
See perlreref(1) for details.

という記述があります。

早速 apt-fileperlreref(1) を検索すると、Debian の場合は以下のパッケージに含まれているようです。

$ apt-file search /perlreref
perl-doc: /usr/share/man/man1/perlreref.1.gz
perl-doc: /usr/share/perl/5.20.2/pod/perlreref.pod
perl-doc-html: /usr/share/doc/perl-doc-html/html/perlreref.html

また、オンラインのマニュアルの場合は

perldoc.perl.org
http://perldoc.perl.org/perlreref.html
perldoc.jp
http://perldoc.jp/pod/perlreref

で確認できます。perldoc.jp のページは日本語に翻訳されていますので、オンラインで確認する場合は、こちらのほうが分かりやすいのではないかと思います。

Perl の正規表現

perldoc.jpperlreref で解説されているメタキャラクタのうち、apt-file で正規表現を使った検索を行う際に、使用頻度が高いと思われるメタキャラクタを抜粋して転記します。

構文

\
直後の文字をエスケープします
.
改行を除く任意の一文字にマッチします (/s が使われていない場合)
^
文字列 (/m が使われている場合は行) の先頭にマッチします
$
文字列 (/m が使われている場合は行) の末尾にマッチします
{...}
先行する要素の繰り返しの範囲を指定します
[...]
ブラケットの内側にある文字のいずれかにマッチします
(...)
$1, $2… のために部分正規表現をグループ化して捕捉します
(?:...)
部分正規表現を捕捉することなくグループ化します (クラスター)
|
左右いずれかにある部分正規表現にマッチします

文字クラス

[amy]
a‘, ‘m‘, ‘y‘ のいずれかにマッチ
[f-j]
ダッシュは「範囲」を指定します
[^f-j]
キャレットは「これら以外にマッチ」を示します
\d
数値 ([0-9] と同じ)
\D
非数値 (^[0-9] または [^\d] と同じ)
\w
単語文字 ([0-9a-zA-Z_] または [^\W] と同じ)
\W
非単語文字 ([^\w] または [^0-9a-zA-Z_] と同じ)

文字アンカー

^
文字列 (/m が指定されている場合には行) の先頭にマッチします
$
文字列 (/m が指定されている場合には行) の終端もしくは改行の前にマッチします
\b
単語境界 (\w¥W の間) にマッチします
\B
単語境界以外 (\w\w の間か ¥W¥W の間) にマッチします
\A
文字列の先頭 (/m には影響されません) にマッチします
\Z
文字列の末尾 (省略可能な改行の前) にマッチします
\z
文字列の本当の末尾にマッチします

量指定子

最大 最小 所有格 範囲
{n,m} {n,m}? {n,m}+ 最低 n 回、m 回以内出現
{n,} {n,}? {n,}+ 最低 n 回出現
{n} {n}? {n}+ 正確に n 回出現
* *? *+ 0 回以上 ({0,} と同じ)
+ +?++   1 回以上 ({1,} と同じ)
? ?? ?+ 0 回または 1 回 ({0,1} と同じ)

apt-file の使用例

apt-file は、そのディストリビューションのすべてのパッケージを対象にして検索しますので、検索対象の結果が表示されるまで、少し時間がかかる場合があります。

まずはオプションを指定せず、アクションのみで apt-get をキーワードにして検索してみます。

$ apt-file search apt-get
apt: /usr/bin/apt-get
apt: /usr/share/man/de/man8/apt-get.8.gz
apt: /usr/share/man/es/man8/apt-get.8.gz
apt: /usr/share/man/fr/man8/apt-get.8.gz
apt: /usr/share/man/it/man8/apt-get.8.gz
apt: /usr/share/man/ja/man8/apt-get.8.gz
apt: /usr/share/man/man8/apt-get.8.gz
apt: /usr/share/man/pl/man8/apt-get.8.gz
apt: /usr/share/man/pt/man8/apt-get.8.gz
auto-apt: /usr/share/doc/auto-apt/examples/auto-apt-get-menu.sh
bash-completion: /usr/share/bash-completion/completions/apt-get
以下省略

あまりにも大量にリストアップされてしまいましたので、実行ファイルに絞って bin/apt-get で検索してみます。

$ apt-file search bin/apt-get
apt: /usr/bin/apt-get
haskell-debian-utils: /usr/bin/apt-get-build-depends

今度は、正規表現を使用して apt のコマンドに関連するマニュアルページを検索してみます。正規表現を使用しますので、オプションの -x または --regexp も使用します。

$ apt-file -x search '/man/man\d/apt.{1,6}\.gz$'
apt-p2p: /usr/share/man/man8/apt-p2p.8.gz
apt: /usr/share/man/man8/apt-get.8.gz
apt: /usr/share/man/man8/apt-key.8.gz
apt: /usr/share/man/man8/apt.8.gz
以下省略

'/man/man\d/apt.{1,6}\.gz$' のうち、

'...'
\d{1,6} は正規表現ではメタキャラクタといいますが、シェルのコマンドラインでメタキャラクタを使う場合は、対象の範囲を '' で囲い、シェルでエラーが発生するのを防ぎます。
/man\d/
\d は数字を表現するメタキャラクタですので、検索でヒットすると man0 から man9 に展開されます。したがって、/man1/ から /man8/ にヒットします。
apt.{1,6}
. は任意の 1 文字ですので、アルファベット、記号にも対応できます。
{1,6} は直前の文字、つまり . でヒットした任意の 1 文字が 1 文字から 6 文字の範囲がヒットの対象になります。ここで指定したものは、「apt とその後ろに 1 文字から 6 文字」となります。
\.gz$
\. は任意の 1 文字ではなく、. という文字として認識させます。
. は正規表現では「メタキャラクタ」と呼ばれますが、メタキャラクタを通常の文字として認識させる場合は、その直前に \ を置きます。これを「エスケープ」と言います。\ もメタキャラクタですので、\ 自身を検索対象に含めたい時には、\\ のようにします。
$ は「文字列の最後」または行単位であれば「改行の直前」を指します。ここで指定したものは、「文字列の最後が .gz で終わるもの」です。

最後に、すべてのパッケージを対象にして日本語マニュアルが含まれているパッケージの一覧を表示してみます。なお、今回は以下のオプションも使ってみます。

-i|--ignore-case
検索文字列の大文字と小文字の区別をさせないオプション。
-l|--package-only
パッケージ名のみを表示させるオプション。ファイル名は表示されません。
$ apt-file -i -l -x search '/man/ja/man\d/.+'
apt
apt-show-source
apt-utils
aptitude
auto-multiple-choice-common
base-passwd
canna
canna-utils
以下省略

/man/ja/man\d/.+ のうち最後の .+ は、

.
任意の 1 文字を表します。
+
直前の文字が 1 回以上出現を表します。

つまり、/ の後ろに英数字、記号などの文字があり、かつその文字が 1 文字以上ある場合にヒットします。

apt-file の基本的な使い方の紹介をさせていただきました。最後までお読みいただきありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です