@znz blog

ZnZ の memo のようなもの

aptitude検索パターンの紹介

| Comments

Debian や Ubuntu のパッケージのインストールなどで コマンドライン操作では apt-getaptitude を使いますが、 ここでは apt-get では出来ない aptitude の便利な使い方を紹介します。

この投稿は ディストリビューション/パッケージマネージャー Advent Calendar 2013 の4日目の記事です。

残ってしまった設定ファイルの削除

deb パッケージのアンインストールは removepurge の二種類があって、 purge すれば設定ファイルまで消えるのですが、 remove だと設定ファイルは残ってしまいます。

普段は apt-get purge hogeaptitude purge hoge で削除していたとしても、 依存関係で自動インストールされたものが 自動削除される時は remove になってしまって 設定ファイルが残ってしまいます。

そういうときに aptitude だと

1
aptitude purge '~c'

で設定ファイルだけ残ったパッケージを一気に purge できます。

この ~c というのが aptitude の search term の一種で、 削除されていて purge (完全削除) されていない、 つまり設定ファイルがシステム上に残っているパッケージという意味になります。

クオートの必要性

'' でクオートしているのはシェルの展開を抑制するためで、 必須ではないのですが、 環境によって意図しない指定になることを避けるために、 常に '' でくくっておくことをお勧めします。 ちなみに、この例だと c というユーザーが存在した場合に そのホームディレクトリに展開されてしまいます。

長い形式と短い形式

ほとんどの search term は短い形式 (short form) と 長い形式 (long form) があり、 ~c が短い形式で対応する長い形式は ?config-files になります。 つまり

1
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

他によく使っているものとしては、

1
aptitude search '~U'

でアップデート対象のパッケージ一覧を見たり、

1
aptitude purge '~i~n 3.2.0-2[1-3]'

のような指定で古いカーネル関連のパッケージを削除したりするのをよく使います。 ~i がインストール済みのものという意味で、 ~n はパッケージ名の検索で引数は正規表現なのですが、 ここでは他に間違ってマッチしそうなものはないため、 . のエスケープは省略してしまうことが多いです。 linux-.* の部分も指定しなくても充分絞り込めるので 省略してしまっています。

~i は引数をとらなくて、デフォルトはパッケージ名の検索なので、 ~i 3.2.0-2[1-3] と省略することも出来ます。

応用例

別 apt-line で入れたパッケージの検索など

たとえば Ubuntu なら

1
aptitude search '~i!~Oubuntu'

のように Origin が Ubuntu 以外のパッケージという検索で Ubuntu の apt-line 以外から入れたパッケージが検索できます。

昔から使い続けている Debian なら

1
aptitude search '~i!~Odebian'

で他の apt-line からインストールしたものに加えて、 昔の Debian にパッケージが存在して、 今の Debian にはもう収録されていないパッケージが残っているものも 探すことも出来ます。

exim から postfix への入れ替え

aptitude installaptitude purge で パッケージを指定する時に末尾に _ を付けると purge できたり、 + を付けるとインストールできたりします。

これらを組み合わせると postfix+ でインストールしつつ、 名前に exim を含むパッケージを purge することで default-mtamail-transport-agent に依存しているパッケージの 依存関係が満たせないと言われずにパッケージの入れ替えができます。

1
sudo aptitude purge '~i~nexim' postfix+

バグがあったパッケージのインストールを止めたい

Debian の unstable や testing を使っていて apt-listbugs を入れていると インストール前にこのパッケージの このバージョンは入れない方が 良さそうということがありますが、 同じソースパッケージで複数のパッケージに分かれていると 指定が面倒なことがあります。

たとえば sysv-rc でバグがあった時に apt-get source sysv-rc でソースパッケージ名を調べて、 対象パッケージを確認した上で 以下のように aptitude forbid-version でそのバージョンはインストールしない、 ということが出来ます。

1
2
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-getapt-cache しか使っていなかったとか、 aptitude を使っていても単純にパッケージ名を指定しかしたことがなかったとか いう人は aptitude purge '~c' だけでも試してみると良いのではないでしょうか。

Comments