2006.02.28

スクリプトからアプリケーションのパスを得る幾つかの方法

スクリプトを書いていてインストール済みアプリケーションのパスを得たいときが結構あるので、その方法をまとめてみました。AppleScript なら path to 命令、10.4 なら mdfind コマンドを使うのが楽かと思います。

path to application "application name"
AppleScript ならこの命令でコロン区切り( : )のエイリアス値を得られます。POSIX path 命令でスラッシュ区切り( / )のファイル値に変換出来ます。Mac の場合はスペースやシェルの特殊文字が含まれる場合が多々あるので、quoted form も付けておいた方が無難です。
path to application "Firefox"
⇒ alias "Mac:Applications:ThirdParty:Firefox.app:"

quoted form of POSIX path of (path to application "Firefox")
⇒ '/Applications/ThirdParty/Firefox.app/'
呼び出すアプリケーションが起動してしまうのが少し鬱陶しいです。シェルスクリプトから使いたい場合は osascript コマンドを使うことになりますが、かなり遅いです。
/usr/bin/mdfind
10.4 の新機能「Spotlight」のコマンドラインツール。引数としてメタデータを指定します。アプリケーションに関係あるメタデータは「kMDItemKind」、「kMDItemContentType」あたりでしょうか(メタデータリファレンス)。
% mdfind 'kMDItemKind == "アプリケーション" && kMDItemFSName == "Firefox.app"'
⇒ /Applications/ThirdParty/Firefox.app
もしくは
% mdfind '(kMDItemContentType=="com.apple.application-file" || kMDItemContentType=="com.apple.application-bundle") && kMDItemFSName=="Firefox.app"'
⇒ /Applications/ThirdParty/Firefox.app
「kMDItemKind」が英語だったり日本語だったり優先言語によって異なるので、「kMDItemContentType」を使った方が良いように思います。ただこれもバンドル形式とそうでないものとでは値が異なるので、どちらか解らなければ「||」で区切ってどちらか一方にマッチするように指定しておく方が無難です。また当然ながら 10.4 以降しか使えません。メタデータの情報は /usr/bin/mdls コマンドで調べられます。

追記(3月2日)

アプリケーションかどうかを判断するには、「kMDItemContentTypeTree」を使うのが良さそうです。「kMDItemContentTypeTree」には UTI が階層的に保持されており、アプリケーションならば値として「com.apple.application」を含んでいますのでこれを条件にしてやります。
% mdfind 'kMDItemContentTypeTree=="com.apple.application" && kMDItemFSName=="Firefox.app"'
⇒ /Applications/ThirdParty/Firefox.app
/usr/bin/find
コマンドラインで検索と言えば find でしょうか。
% find /Applications -type d -name Firefox.app
⇒ /Applications/ThirdParty/Firefox.app
便利なんですが、検索するパスを限定して実行しないとかなり時間がかかってしまいます。
/usr/bin/locate
find と同じく unix 由来の検索コマンドです。find と違うのは専用のデータベースを使って、素早く結果を得ることが出来ます。
% locate Firefox.app | grep 'Firefox\.app$'
⇒ /Applications/ThirdParty/Firefox.app
なかなか素敵なコマンドですが、データベースの更新には時間と負荷が結構かかります。更新も weekly スクリプト内で実行されている為(手動で更新も出来ますが)、リアルタイムでの検索にはあまりむいていません。
関連記事

この記事へのトラックバックURL
http://wildlifesanctuary.blog38.fc2.com/tb.php/49-6f41a756
この記事へのトラックバック
この記事へのコメント