تحديد ما إذا كان الدليل عبارة عن حزمة أو حزمة في محطة Mac OS X؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

أود أن أكون قادرًا على تحديد ما إذا كان الدليل مثل ".app" يعتبر حزمة أو حزمة من وجهة نظر Finder في سطر الأوامر.لا أعتقد أن هذا سيكون صعبًا باستخدام برنامج الصدفة الصغير، لكنني أفضل عدم إعادة اختراع العجلة إذا لم أضطر لذلك.

هل كانت مفيدة؟

المحلول

تحديث:

على جميع الأنظمة التي تحتوي على 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.بالطبع، كل شيء يحتوي على كلمة "حزمة" في الاسم يعني أن الحزم بالفعل، ولكن ليست جميعها، عبارة عن حزم (الحزم هي مجموعة فرعية محددة من الحزم التي لها بنية دليل محددة جيدًا).


الجواب القديم:

يمكنك الحصول على قائمة بجميع امتدادات أنواع الملفات المسجلة، باستخدام هذا الأمر (OS X قبل Leopard):

/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 (التي ألقيناها أعلاه).إذا تابعت ما إذا كانت تحتوي على قائمة أم لا أو ما إذا تم تعيين بت الحزمة أم لا، فقد تتمكن من التقاط بعض أو حتى العديد من الحزم، لكن لا يمكنك التقاطها جميعًا.هذه هي قاعدة البيانات التي يستخدمها Finder لتحديد

  • هل هذا الدليل حزمة أم لا؟
  • هل هذا امتداد ملف معروف أم لا؟
  • ما هي التطبيقات التي يجب إدراجها ضمن "فتح باستخدام" لهذا النوع من الملفات؟
  • ما هو الرمز الذي يجب أن أستخدمه لعرض نوع الملف هذا؟

وبعض الأشياء الأخرى.

[يحرر:تمت إضافة مسار لـ Leopard، شكرًا لـ Hagelin على التحديث]

نصائح أخرى

هذا متأخر بعض الشيء، ولكن:يبدو أنه يمكنك اكتشاف الحزم باستخدام الأمر mdls.على وجه التحديد، الإخراج (متعدد الأسطر) لـ:

mdls -name kMDItemContentTypeTree /Path/To/Directory

سوف تحتوي على السلسلة

"com.apple.package"

(بما في ذلك علامات الاقتباس، على الأقل من الأسد) في مكان ما إذا كان الدليل عبارة عن حزمة.إذا كانت الحزمة أيضًا عبارة عن حزمة، فسيحتوي الإخراج أيضًا

"com.apple.bundle"

وأخيرًا وليس آخرًا، إذا كانت حزمة تطبيق على وجه التحديد، فسوف يحتوي الإخراج أيضًا على

"com.apple.application-bundle"

(وهذا وفقًا لبعض الاختبارات المحدودة للغاية، ولكن من خلال وثائق Apple الخاصة بمعرفات النوع الموحد، وصفحة الدليل الخاصة بـ mdls، يجب أن يكون هذا صحيحًا.وبالنسبة للعناصر التي اختبرتها، كان هذا صحيحًا بالنسبة للحزم غير المقدمة من Apple أيضًا، وهو ما تتوقعه نظرًا للغرض من عدوى المسالك البولية.)

على الرغم من أنه يمكنك تحديد بعض الحزم بناءً على وجود "./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

يجب أن تكون قادرًا على الحصول على ما تريد عن طريق التحقق لمعرفة ما إذا كان السطر الأول من الإخراج ينتهي بـ "package".

launch موجود في Fink وMacPorts أيضًا.

</plug>

يجب أن تكون هناك طريقة للقيام بذلك بسهولة من سطر الأوامر، لأنني كمستخدم لـ AppleScript، يمكنني القيام بذلك باستخدام أحداث النظام.لذا، إذا فشلت كل الخطوات الأخرى، يمكنك تنفيذ 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".يمكنك التحقق من وجود هذا في الدليل، إذا كان الأمر كذلك فهو حزمة/حزمة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top