Mac OS Xのパッケージファイルを操作する

Mac OS Xではアプリケーションなどをインストールするときに伝統的に.pkgで終わるパッケージが使われています。 しかし、インストールする前にどんなファイルが展開されるんだろう、とか、あのインストーラーに入ってるあのファイルだけ取り出したい、みたいなことがあると思います。

そんなパッケージにまつわる基本的な操作をまとめました。基本的にTerminal.appでの操作になります。

インストールされているパッケージの一覧

pkgutil --pkgs

例えば、mysqlが入ってるかなーとかは、

$ pkgutil --pkgs|grep '[m]ysql'
com.mysql.mysql

となります。[]がついてるのは、そういうgrepのテクニックです。

インストールされているファイルの一覧

既にインストールされているmysqlのパッケージがインストールしたファイルの一覧は次にようにします。インストール前のpkgに対しては後述。

pkgutil --files com.mysql.mysq

インストールされているファイルの削除

一応pkgutilにオプションがあったんですが(--unlink)、うまく消せないし、フォルダが残ることがあるし、なんかコマンドそれ自体がなくなった気もするので、自前のコマンドを作っています。このあたりから入手してください。 こういうのはrootで実行しますが、なんか重要なファイル消えちゃうかもなので、自己責任で。

インストールされているパッケージを消す

ファイルの削除ではなく、パッケージの登録を消す場合は次のようにします。

pkgutil --forget com.mysql.mysq

インストール前のパッケージのファイル一覧

どんなファイルがpkgでインストールされるか知るには、パッケージによって2種類の方法があります。まず、pkgが単一のファイルの場合(Flat Package File)は次のようにします。

pkgutil --payload-files path-to-flat-package-file.pkg

もし、pkgファイルがディレクトリ形式の場合は次のようにします。

lsbom path-to.pkg/Contents/Archive.bom

BOMってなんじゃらほいってことですが、Bill of Materialsという意味だそうです。詳しくはman bomで。

インストール前のパッケージからファイルを取り出す

これも2種類それぞれに違う方法が必要です。まず、Flat Package Fileの場合は次にようにしまう。

pkgutil --expand path-to-flat-package-file.pkg ./tmp
ditto -x --bom ./tmp/path-to-Bom ./tmp/path-top-Payload ./

pkgutilでFlat Package Fileからディレクトリに展開して、その中にあるBomを使ってPayloadファイルからファイルを取り出します。めんどくさい…

ディレクトリの場合は次のようにします。

pax -rzf path-to.pkg/Contents/Archive.pax.gz

また別のコマンド… なんだか様々な圧縮方法とファイル形式があって、非常に大変です。


他にもArchive.bomがない場合とかいろんな形式がある雰囲気なので、もっと良い方法があったら@niwまで教えてもらえると嬉しいです!