Debian や Ubuntu のパッケージのインストールなどで コマンドライン操作では apt-get や aptitude を使いますが、 ここでは apt-get では出来ない aptitude の便利な使い方を紹介します。
この投稿は ディストリビューション/パッケージマネージャー Advent Calendar 2013 の4日目の記事です。
残ってしまった設定ファイルの削除
deb パッケージのアンインストールは remove と purge の二種類があって、 purge すれば設定ファイルまで消えるのですが、 remove だと設定ファイルは残ってしまいます。
普段は apt-get purge hoge や aptitude purge hoge で削除していたとしても、 依存関係で自動インストールされたものが 自動削除される時は remove になってしまって 設定ファイルが残ってしまいます。
そういうときに aptitude だと
aptitude purge '~c'
で設定ファイルだけ残ったパッケージを一気に purge できます。
この ~c というのが aptitude の search term の一種で、 削除されていて purge (完全削除) されていない、 つまり設定ファイルがシステム上に残っているパッケージという意味になります。
クオートの必要性
'' でクオートしているのはシェルの展開を抑制するためで、 必須ではないのですが、 環境によって意図しない指定になることを避けるために、 常に '' でくくっておくことをお勧めします。 ちなみに、この例だと c というユーザーが存在した場合に そのホームディレクトリに展開されてしまいます。
長い形式と短い形式
ほとんどの search term は短い形式 (short form) と 長い形式 (long form) があり、 ~c が短い形式で対応する長い形式は ?config-files になります。 つまり
aptitude purge '?config-files'
でも同じ意味になります。
検索パターンの確認
aptitude search でも aptitude purge でも aptitude install でも 同じように使えるので、 aptitude search で確認してから aptitude purge するとか、 aptitude install するという使い方も出来ます。
Search Term reference
search term の一覧は aptitude-doc-ja パッケージを入れて参照するか、 Search term reference などを参照してください。
他によく使っている search term
他によく使っているものとしては、
aptitude search '~U'
でアップデート対象のパッケージ一覧を見たり、
aptitude purge '~i~n 3.2.0-2[1-3]'
のような指定で古いカーネル関連のパッケージを削除したりするのをよく使います。 ~i がインストール済みのものという意味で、 ~n はパッケージ名の検索で引数は正規表現なのですが、 ここでは他に間違ってマッチしそうなものはないため、 . のエスケープは省略してしまうことが多いです。 linux-.* の部分も指定しなくても充分絞り込めるので 省略してしまっています。
~i は引数をとらなくて、デフォルトはパッケージ名の検索なので、 ~i 3.2.0-2[1-3] と省略することも出来ます。
応用例
別 apt-line で入れたパッケージの検索など
たとえば Ubuntu なら
aptitude search '~i!~Oubuntu'
のように Origin が Ubuntu 以外のパッケージという検索で Ubuntu の apt-line 以外から入れたパッケージが検索できます。
昔から使い続けている Debian なら
aptitude search '~i!~Odebian'
で他の apt-line からインストールしたものに加えて、 昔の Debian にパッケージが存在して、 今の Debian にはもう収録されていないパッケージが残っているものも 探すことも出来ます。
exim から postfix への入れ替え
aptitude install や aptitude purge で パッケージを指定する時に末尾に _ を付けると purge できたり、 + を付けるとインストールできたりします。
これらを組み合わせると postfix+ でインストールしつつ、 名前に exim を含むパッケージを purge することで default-mta や mail-transport-agent に依存しているパッケージの 依存関係が満たせないと言われずにパッケージの入れ替えができます。
sudo aptitude purge '~i~nexim' postfix+
バグがあったパッケージのインストールを止めたい
Debian の unstable や testing を使っていて apt-listbugs を入れていると インストール前にこのパッケージの このバージョンは入れない方が 良さそうということがありますが、 同じソースパッケージで複数のパッケージに分かれていると 指定が面倒なことがあります。
たとえば sysv-rc でバグがあった時に apt-get source sysv-rc でソースパッケージ名を調べて、 対象パッケージを確認した上で 以下のように aptitude forbid-version でそのバージョンはインストールしない、 ということが出来ます。
aptitude search '?installed ?source-package(sysvinit)'
sudo aptitude forbid-version '?installed ?source-package(sysvinit)'
その他いろいろ
最後にその他のいろいろな例を列挙しておきます。 詳しい説明は aptitude のリファレンスなどを参照してください。
-
aptitude search '?maintainer(uwabami): メンテナで探す -
aptitude search '~t minimal': タスクでインストールされるパッケージ -
aptitude search '~n^lsb': 名前が lsb で始まるパッケージ -
aptitude search '?section(metapackages)': メタパッケージ -
aptitude search '?priority(important)': 優先度が重要のパッケージ -
aptitude search '?provides(mail-transport-agent)':mail-transport-agentを提供しているパッケージ
まとめ
今回は aptitude の検索パターンの便利な使い方を紹介しました。
今まで apt-get や apt-cache しか使っていなかったとか、 aptitude を使っていても単純にパッケージ名を指定しかしたことがなかったとか いう人は aptitude purge '~c' だけでも試してみると良いのではないでしょうか。