تحديد ما إذا كان الدليل عبارة عن حزمة أو حزمة في محطة Mac OS X؟
سؤال
أود أن أكون قادرًا على تحديد ما إذا كان الدليل مثل ".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".يمكنك التحقق من وجود هذا في الدليل، إذا كان الأمر كذلك فهو حزمة/حزمة.