4

「.app」などのディレクトリが、コマンド ラインで Finder の観点からパッケージまたはバンドルと見なされるかどうかを判断できるようにしたいと考えています。小さなシェル プログラムでこれを行うのは難しいとは思いませんが、必要がなければ車輪の再発明はしたくありません。

4

6 に答える 6

8

これは少し遅れていますが、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の目的を考えるとあなたが期待するものです.)

于 2012-09-02T06:00:49.890 に答える
4

'./contents/Info.plist" の存在に基づいて一部のバンドルを識別できますが、すべてのバンドル タイプ (ドキュメントやレガシー バンドルなど) に必要なわけではありません。Finder は、ファイル拡張子に基づいてディレクトリをバンドルとして識別します。 (.app、.bundle など) またはバンドル ビットが設定されている場合。

コマンド ラインからバンドル ビットを確認するには、次のコマンドを使用します。

getFileInfo -aB directory_name

すべてのケースをキャッチするために、次を確認します。

  • バンドルビットはセットされていますか?
  • そうでない場合、バンドルであることを示すファイル拡張子が付いていますか? (メッキーの答えを参照)
  • そうでない場合は、おそらくバンドルではありません。
于 2008-09-23T15:24:15.707 に答える
4

アップデート:

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 の更新に感謝します]

于 2008-09-23T17:23:54.000 に答える
0

コマンド ラインから簡単に実行できる方法があるはずです。なぜなら、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
于 2009-04-12T18:07:20.283 に答える
-2

バンドルには常にファイル `./contents/Info.plist' が必要です。これがディレクトリに存在するかどうかを確認できます。存在する場合は、パッケージ/バンドルです。

于 2008-09-23T14:03:28.507 に答える