この前 mas-cli という MacでコマンドラインからApp Storeからインストールしたアプリの一覧を調べたり それをインストールしたり出来る様にするコマンドを紹介しました。
古い環境で使えなそう、という以外、コレ使っておけば良い感じなんですが、 直接IDを調べたり他の方法でインストールできれば色々便利なので、 ちょっとコレを使わずに出来るのか探してみました。
App Storeからインストールしたアプリ一覧については、
上で紹介していますが、App Storeからインストールしたアプリの中には Contents/_MASReceipt/receiptというファイルがあります。 このファイルがApp Store関連お情報とかを持ってるみたい?です。
とにかくこのファイルはApp Storeのアプリにのみあるので、これを探して、
$ find /Applications -path '*Contents/_MASReceipt/receipt' -maxdepth 4 | cut -d '/' -f 3
App Language Chooser.app
Degrees.app
...
みたいにすればアプリ名が取得できます。 フルパスを取得したければパイプ後を削除で。
これをアプリが入っている可能性のある、 /Applications、/Applications/Utilities に対してやれば大概の場合すべて見つかるはずです。
一方、下のページには別の方法が示されています。
Find if an application is from the Mac App Store - Mac OS X Hints
ここを見ると、App Storeのアプリをmdls
というメタデータを抽出するコマンドを使うと、
$ mdls /Applications/App\ Language\ Chooser.app
_kMDItemOwnerUserID = 0
kMDItemAlternateNames = (
"App Language Chooser.app"
)
kMDItemAppStoreAdamID = "451732904"
kMDItemAppStoreCategory = "デベロッパツール"
kMDItemAppStoreCategoryType = "public.app-category.developer-tools"
kMDItemAppStoreHasReceipt = 1
...
と沢山表示されますが、最初の方にkMDItemAppStoreHasReceipt
という項目があり、 これが1になっています。
他のアプリではこの項目は表示されません。
従って、これが1の値を持つものをリストすれば良いのですが、それも mdfind
というSpotlightのコマンドラインインターフェースを使うことで 簡単に取得できます。
$ mdfind "kMDItemAppStoreHasReceipt=1" | awk '{n=split($0, tmp, "/")}{print tmp[n]}'
App Language Chooser.app
Degrees.app
...
こんな感じ。 mdfind
に<kMDItem~>=<Value>
の値を与えるとそのメタ情報を持った ファイルを取得出来ます。
検索先として、
$ mdfind -onlyin /Applications "kMDItemAppStoreHasReceipt=1" | awk '{n=split($0, tmp, "/")}{print tmp[n]}'
の様に-onlyin
で場所指定することも出来ますが、 しなくても十分速いので全て検索したいなら一気に全検索で大丈夫です。 (上のfind
の場合は流石に/
とかで探したらちょっと厳しい。)
パイプ後は、先ほどと違って前につくディレクトリの数が分からないので ちょっと工夫。
ただし、ファイルはSpotlightにインデックスされている必要があるので 入れたばかりのものとかSpotlightにインデックスされない領域にあるものは表示されません。
試した所、何故かKeynote、Numbers、Pagesと言ったOS XのOfficeソフトだけ 表示されませんでした。。。 が、何故かSpotlightだとちゃんと見つかります。 さらに、一度Keynoteを立ち上げてみたところ、その後はきちんと見つかる様になりました。
一切使ってなかった事はありますが、Spotlightからだとちゃんと見つかるので良く分かりません。
まあ、通常、インストールしたアプリはすぐに一回くらいは使うので良いかな、と。 そもそも使ってないなら無いも同じで。。。
ということで、こちらのが簡単といえば簡単。
さらに、上のmdls
の結果を見て分かる通り、このコマンドで kMDItemAppStoreAdamID
というのがありますが、 これがアプリのApple StoreでのIDになります。
なのでこれを使えばmas
でもインストールできます。
取得するなら
$ mdls -name kMDItemAppStoreAdamID -raw /Applications/App\ Language\ Chooser.app
451732904
とすると直接取得できます。 (-name
で指定した項目のみ取得、raw
で値のみ表示。)
アプリ名だけでなくアプリへのパスが必要です。 一括取得するなら組み合わせて
$ mdfind "kMDItemAppStoreHasReceipt=1" | while read a;do echo $(mdls -name kMDItemAppStoreAdamID -raw "$a") $(echo $a|awk '{n=split($0, tmp, "/")}{print tmp[n]}');done | sort -k2
みたいなワンライナーでもIDとアプリ名が取ってこれます。
これで純正コマンドだけでアプリを取得してIDも取得できます。
以下を参考しました。
ID取得方法も載ってますが、インストール方法として、
$ open -W "macappstore://itunes.apple.com/cn/app/id$appid"
が載っています。 open
はOS Xの何でも開くコマンドですが、 -W
を指定すると開いたファイルなりアプリなりが閉じるまで コマンドライン側は待機状態になります。
で、macappstore:://
で指定したものは、 App Store.appで開かれ、指定したIDのアプリのページを開きます。
上のURLはcn
で中国のURLですが、この部分は無くても結局手元のApp Store.appで 開くので問題ないので、
$ open -W "macappstore://itunes.apple.com/app/id451732904
みたいにするとApp Store.appが立ち上がってApp Language Chooser.appのページが 開かれます1。
ここで実はコマンドラインから、と言っても完全ではなく、 ここではApp Storeのインストールボタンを押してインストールしなくてはいけません。
mas-cli install 451732904
の様には行かず。
今のところここまででした。
この前mas-cli
を含めてApp Storeのアプリもリスト、インストール 出来る様にしましたが、 この中では完全にmas-cli
に依存してたので、 mas-cli
がどうしても使えない環境でも使える様にしてみました。
検索方法としてはmdfind
だと手元の環境だけかもしれませんが 取得できないものもあったので find
を使った前も使ってた方法で行っています。
mdls
により今回からmas-cli
がなくてもIDも取得出来る様になっています。
インストールに関しては上にも書いたように、 brew file install
でインストールするアプリが見つかったら、 mas-cli
が使えない場合は App Store.appが立ち上がるのでそこでインストール出来る様になります。
まあ現状El Capitanになっていればmas-cli
を使えるので 意味があるかどうかは分かりませんがやってみたかっただけな実装。
もしインストールに関しても簡単に既存のコマンドだけで出来るのであれば mas-cli
から脱却してシンプルに出来るのにな、とまだ模索中。
Webで見てみると
こんな感じでjp
だと日本語、en
または何も無いと英語、 cn
だとちゃんと中国語のサイトに行きます。 ↩