「.app」などのディレクトリが、コマンド ラインで Finder の観点からパッケージまたはバンドルと見なされるかどうかを判断できるようにしたいと考えています。小さなシェル プログラムでこれを行うのは難しいとは思いませんが、必要がなければ車輪の再発明はしたくありません。
6 に答える
これは少し遅れていますが、mdls コマンドを使用してバンドルを検出できるようです。具体的には、次の (複数行の) 出力:
mdls -name kMDItemContentTypeTree /Path/To/Directory
文字列が含まれます
"com.apple.package"
ディレクトリがパッケージの場合、どこかに (少なくとも Lion の時点では引用符を含めて)。パッケージもバンドルである場合、出力には次も含まれます
"com.apple.bundle"
最後になりましたが、それが特にアプリケーション バンドルである場合、出力には以下も含まれます。
"com.apple.application-bundle"
(これはいくつかの非常に限定的なテストによるものですが、Uniform Type Identifiers に関する Apple のドキュメントと mdls のマニュアル ページから、これは当てはまるはずです。私がテストした項目については、これは Apple 以外が提供するバンドルにも当てはまりました。 、これはUTIの目的を考えるとあなたが期待するものです.)
'./contents/Info.plist" の存在に基づいて一部のバンドルを識別できますが、すべてのバンドル タイプ (ドキュメントやレガシー バンドルなど) に必要なわけではありません。Finder は、ファイル拡張子に基づいてディレクトリをバンドルとして識別します。 (.app、.bundle など) またはバンドル ビットが設定されている場合。
コマンド ラインからバンドル ビットを確認するには、次のコマンドを使用します。
getFileInfo -aB directory_name
すべてのケースをキャッチするために、次を確認します。
- バンドルビットはセットされていますか?
- そうでない場合、バンドルであることを示すファイル拡張子が付いていますか? (メッキーの答えを参照)
- そうでない場合は、おそらくバンドルではありません。
アップデート:
Spotlight を使用mdls
するすべてのシステムで、 kMDItemContentTypeTree プロパティを参照してバンドルを検出できます。例えば:
mdls -name kMDItemContentTypeTree "/Applications/Safari.app"
私のために次の出力を生成します
kMDItemContentTypeTree = (
"com.apple.application-bundle",
"com.apple.application",
"public.executable",
"com.apple.localizable-name-bundle",
"com.apple.bundle",
"public.directory",
"public.item",
"com.apple.package"
)
そこを見るcom.apple.package
と、Finderでパッケージとして表示されるはずです。もちろん、名前に「バンドル」が付いているものはすべて、すべてのパッケージが既にバンドルされているわけではありません (バンドルは、明確に定義されたディレクトリ構造を持つパッケージの特定のサブセットです)。
古い答え:
次のコマンドを使用して、登録されているすべてのファイル タイプ拡張子のリストを取得できます (Leopard より前の OS X)。
/System/Library/Frameworks/ApplicationServices.framework/Frameworks\
/LaunchServices.framework/Support/lsregister -dump
または Leopard 以降の場合:
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks\
/LaunchServices.framework/Versions/A/Support/lsregister -dump
そこにあるすべてのファイル拡張子にはフラグがあります。パッケージ フラグが設定されている場合、これはパッケージです。
例えば
claim id: 806354944
name: Bundle
role: none
flags: apple-internal relative-icon-path package
icon: Contents/Resources/KEXT.icns
bindings: .bundle
--------------------------------------------------------
claim id: 1276116992
name: Plug-in
role: none
flags: apple-internal relative-icon-path package
icon: Contents/Resources/KEXT.icns
bindings: .plugin
これをバンドルではないファイルと比較します
claim id: 2484731904
name: TEXT
role: viewer
flags: apple-internal
icon:
bindings: .txt, .text, 'TEXT'
実際にすべてのバンドルを取得する唯一の方法は、LaunchService データベース (上記でダンプしたもの) を検索することです。plist があるかどうか、またはバンドル ビットが設定されているかどうかだけを調べれば、一部または多数のバンドルをキャッチできるかもしれませんが、すべてをキャッチすることはできません。これは、Finder が特定するために使用するデータベースです。
- このディレクトリはバンドルですか?
- これは既知のファイル拡張子ですか?
- このファイル タイプの [開く] の下に表示されるアプリケーションはどれですか?
- このファイルの種類を表示するには、どのアイコンを使用すればよいですか?
などなど。
[編集: Leopard のパスを追加しました。Hagelin の更新に感謝します]
コマンド ラインから簡単に実行できる方法があるはずです。なぜなら、AppleScript ユーザーとして、System Events を使用して実行できるからです。したがって、他のすべてが失敗した場合は、次のようにコマンドラインから必要な AppleScript を実行できます。
$ FILE=/Users/myuser/Desktop/foo.rtfd
$ osascript -e "tell application \"System Events\" to get package folder of alias POSIX file \"${FILE}\""
結果は
true
バンドルには常にファイル `./contents/Info.plist' が必要です。これがディレクトリに存在するかどうかを確認できます。存在する場合は、パッケージ/バンドルです。