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-doc
とperl-doc-html
パッケージに含まれているのですが、apt-file の正規表現に記載したように、オンラインのマニュアルで確認したほうが分かりやすいのではないかと思います。-v
|--verbose
- 冗長モードで
apt-file
を実行します。 -h
|--help
- ヘルプ画面を表示します。
アクション
アクションは、検索を実行するためのコマンドです。
update
- コマンド
curl
またはwget
を使用し、/etc/apt/sources.list
に書かれている場所からデータファイルをダウンロードします。 search
|find
‘pattern
‘- パッケージを検索するコマンドです。
- パターン ‘
pattern
‘ を含むすべてのパッケージのリストが返されます。ファイル名のみではなく、ディレクトリ名も検索します。 list
|show
‘pattern
‘- パターン ‘
pattern
‘ にマッチするパッケージの内容を表示します。dpkg -L
コマンドに非常に近いです。 purge
- キャッシュディレクトリからすべてのキャッシュファイル
Contents-*
を削除します。
apt-file の正規表現
前項のとおり、apt-file
は Perl
の用法に従った正規表現が利用できます。apt-file
のマニュアルページに
Treat pattern as a (perl) regular expression.
See perlreref(1) for details.
という記述があります。
早速 apt-file
で perlreref(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.jp
の perlreref で解説されているメタキャラクタのうち、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
の基本的な使い方の紹介をさせていただきました。最後までお読みいただきありがとうございました。