디렉토리가 Mac OS X 터미널의 번들 또는 패키지인지 확인하십시오.

StackOverflow https://stackoverflow.com/questions/121147

  •  02-07-2019
  •  | 
  •  

문제

'.app'과 같은 디렉토리가 명령 줄에서 Finder의 관점에서 패키지 또는 번들로 간주되는지 여부를 결정할 수 있습니다. 나는 이것이 작은 쉘 프로그램으로하기가 어렵다고 생각하지 않지만, 필요하지 않다면 바퀴를 다시 발명하지 않을 것입니다.

도움이 되었습니까?

해결책

업데이트:

스포트라이트가있는 모든 시스템에서 사용 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

또는 표범과 나중에 :

/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인지 아닌지 또는 번들 비트가 설정되어 있는지 여부에 따라 가면 일부 또는 많은 다발을 잡을 수 있지만 모든 것을 잡을 수는 없습니다. 이것은 데이터베이스 파인더가 결정하는 데 사용하는 것입니다

  • 이 디렉토리는 번들입니까?
  • 알려진 파일 확장자입니까?
  • 이 파일 유형의 경우 "Open with with"아래에 어떤 응용 프로그램이 나열되어야합니까?
  • 이 파일 유형을 표시하는 데 어떤 아이콘을 사용해야합니까?

그리고 더 많은 것들.

편집 : Hagelin 덕분에 Leopard의 경로가 추가되었습니다.

다른 팁

이것은 조금 늦었지만 : MDLS 명령을 사용하여 번들을 감지 할 수있는 것 같습니다. 구체적으로, (멀티 라인) 출력 :

mdls -name kMDItemContentTypeTree /Path/To/Directory

문자열이 포함됩니다

"com.apple.package"

디렉토리가 패키지 인 경우 어딘가에 어딘가에있는 (적어도 사자에 따라 인용 표시 포함). 패키지가 번들 인 경우 출력에도 포함됩니다.

"com.apple.bundle"

그리고 마지막으로, 특히 응용 프로그램 번들 인 경우 출력에도 포함됩니다.

"com.apple.application-bundle"

(이것은 매우 제한된 테스트에 따르면, 균일 한 유형 식별자에 대한 Apple의 문서와 MDL의 Man Page에서 이것은 사실이어야합니다. 그리고 테스트 한 항목의 경우, 이것은 외부로 제공되지 않은 번들에 대해서도 마찬가지입니다. UTIS의 목적을 감안할 때 예상되는 것입니다.)

'./contents/info.plist "의 존재에 따라 일부 번들을 식별 할 수 있지만 모든 번들 유형 (예 : 문서 및 레거시 번들)에는 필요하지 않습니다. Finder는 파일 확장자를 기반으로 디렉토리를 번들로 식별합니다. (.app, .bundle 등) 또는 번들 비트가 설정된 경우.

명령 줄 사용에서 번들 비트를 확인하려면 다음과 같습니다.

getFileInfo -aB directory_name

모든 사례를 잡으려면 다음을 확인합니다.

  • 번들 비트가 설정되어 있습니까?
  • 그렇지 않은 경우,이를 번들로 식별하는 파일 확장자가 있습니까? (보다 메키의 대답)
  • 그렇지 않다면 아마도 번들이 아닐 것입니다.

<plug>

나의 시작하다 도구에는이 기능이 있습니다. 예를 들어:

% launch -f Guards.oo3 
Guards.oo3: non-application package 
    type: ''    creator: ''
    kind: OmniOutliner 3
    content type ID: com.omnigroup.omnioutliner.oo3-package
    contents: 1 item
    created: 3/6/09 3:36:50 PM
    modified: 3/6/09 4:06:13 PM
    accessed: 4/12/09 1:10:36 PM [only updated by Mac OS X]
    backed up: 12/31/03 6:00:00 PM

% launch -f /Applications/Safari.app
/Applications/Safari.app: scriptable Mac OS X application package 
    type: 'APPL'    creator: 'sfri'
    architecture: PowerPC 7400, Intel 80x86
    bundle ID: com.apple.Safari
    version: 4 Public Beta
    kind: Application
    content type ID: com.apple.application-bundle
    contents: 1 item
    created: 8/21/07 5:11:33 PM
    modified: 2/24/09 7:29:51 PM
    accessed: 4/12/09 1:10:51 PM [only updated by Mac OS X]
    backed up: 12/31/03 6:00:00 PM

첫 번째 출력 라인이 '패키지'로 끝나는 지 확인하여 원하는 것을 얻을 수 있어야합니다.

launch Fink와 MacPorts에도 있습니다.

</plug>

사과 스크립트 사용자로서 시스템 이벤트를 사용하여 수행 할 수 있기 때문에 명령 줄에서 쉽게 수행 할 수있는 방법이 있어야합니다. 따라서 다른 모든 것이 실패하면 다음과 같이 명령 줄에서 필요한 사과 스크립트를 실행할 수 있습니다.

$ 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 '파일이 있어야합니다. 디렉토리 에서이 존재를 확인할 수 있습니다. 그렇다면 패키지/번들입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top