Перечислить все установленные приложения в OS X

Основная проблема

Я ищу решение для перечисления всех приложений, установленных в системе (Mac) OS X, то есть всех пакетов приложений, зарегистрированных в LaunchServices.

Простой подход, который не сработал

(Обратите внимание: lsregister находится под /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister).

В настоящее время я использую вывод lsregister -dump | grep -E '^.*[ \\t]*path:[ \\t]+(\/.*)$' | grep -Eo '\/.*', у которого есть несколько проблем:

  • Пакеты .app с символами новой строки (\n, что допустимо в UNIX) обрабатываются неправильно (эту проблему можно решить, написав соответствующий синтаксический анализатор)
  • lsregister неправильно обрабатывает странные имена файлов (например, содержащие метку RTL). lsregister просто игнорирует файлы с пометкой RTL в имени. Если вы хотите, вы можете создать файл с RTL в его имени, выполнив следующую команду.

    python -c 'import shutil; shutil.copytree(u"/Applications/TextEdit.app", u"/Applications/ThisIsAWeird\u202EApp.app")'
    

    После этого lsregister -dump | grep ThisIsAWeird не будет его раскрывать. Но когда вы щелкните правой кнопкой мыши текстовый файл и выберите «Открыть с помощью», вы увидите, что LaunchServices и Finder по-прежнему поддерживают этот файл. посмотрите сами

Простое перечисление всех файлов в /Applications и других каталогах не работает, потому что LaunchServices знает о пакетах приложений в произвольных папках, и мне тоже нужны эти приложения.

Другой подход, с которым я не работал

По-видимому, есть частная функция API под названием _LSFindApplications, которая делает именно то, что мне нужно, но я не могу заставить ее работать и не нашел никакой неофициальной документации в Интернете. (доказательство существования: nm /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/LaunchServices | grep __LSFindApplications$)

ОБНОВЛЕНИЕ: метод system_profiler также не работает

До сих пор я думал, что метод system_profiler, предложенный @Anoop, работает, но сегодня я обнаружил, что lsregister по-прежнему собирает больше двоичных файлов. Некоторые или отсутствуют на всех машинах, некоторые отсутствуют только в system_profiler, когда вы смонтировали внешний том с другой установкой OS X. Вот список того, что отсутствует в выводе system_profiler (но присутствует в lsregister) на одном из моих машины:

/Applications/Automator.app/Contents/Resources/Application Stub.app
/Applications/Google Chrome.app/Contents/Versions/30.0.1599.69/Google Chrome Framework.framework/Resources/app_mode_loader.app
/Applications/Google Chrome.app/Contents/Versions/30.0.1599.69/Google Chrome Framework.framework/Resources/crash_report_sender.app
/Applications/Google Chrome.app/Contents/Versions/30.0.1599.69/Google Chrome Helper EH.app
/Applications/Google Chrome.app/Contents/Versions/30.0.1599.69/Google Chrome Helper NP.app
/Applications/Google Chrome.app/Contents/Versions/30.0.1599.69/Google Chrome Helper.app
/System/Library/CoreServices/AddPrinter.app
/System/Library/CoreServices/AirPlayUIAgent.app
/System/Library/CoreServices/AppleFileServer.app
/System/Library/CoreServices/AppleGraphicsWarning.app
/System/Library/CoreServices/AppleScript Runner.app
/System/Library/CoreServices/AppleScript Utility.app
/System/Library/CoreServices/CalendarFileHandler.app
/System/Library/CoreServices/Certificate Assistant.app
/System/Library/CoreServices/CoreLocationAgent.app
/System/Library/CoreServices/CoreServicesUIAgent.app
/System/Library/CoreServices/CoreTypes.bundle
/System/Library/CoreServices/Database Events.app
/System/Library/CoreServices/DiskImageMounter.app
/System/Library/CoreServices/Expansion Slot Utility.app
/System/Library/CoreServices/File Sync.app
/System/Library/CoreServices/FileSyncAgent.app
/System/Library/CoreServices/Folder Actions Dispatcher.app
/System/Library/CoreServices/Folder Actions Setup.app
/System/Library/CoreServices/HelpViewer.app
/System/Library/CoreServices/Image Events.app
/System/Library/CoreServices/Install in Progress.app
/System/Library/CoreServices/Jar Launcher.app
/System/Library/CoreServices/Java Web Start.app
/System/Library/CoreServices/KeyboardSetupAssistant.app
/System/Library/CoreServices/Language Chooser.app
/System/Library/CoreServices/LocationMenu.app
/System/Library/CoreServices/MRTAgent.app
/System/Library/CoreServices/Memory Slot Utility.app
/System/Library/CoreServices/NetAuthAgent.app
/System/Library/CoreServices/Network Diagnostics.app
/System/Library/CoreServices/Network Setup Assistant.app
/System/Library/CoreServices/ODSAgent.app
/System/Library/CoreServices/Pass Viewer.app
/System/Library/CoreServices/Printer Setup Utility.app
/System/Library/CoreServices/RegisterPluginIMApp.app
/System/Library/CoreServices/Screen Sharing.app
/System/Library/CoreServices/SecurityAgent.app
/System/Library/CoreServices/SecurityFixer.app
/System/Library/CoreServices/SocialPushAgent.app
/System/Library/CoreServices/System Events.app
/System/Library/CoreServices/System Image Utility.app
/System/Library/CoreServices/SystemUIServer.app
/System/Library/CoreServices/Ticket Viewer.app
/System/Library/CoreServices/UniversalAccessControl.app
/System/Library/CoreServices/UnmountAssistantAgent.app
/System/Library/CoreServices/UserNotificationCenter.app
/System/Library/CoreServices/VoiceOver.app
/System/Library/CoreServices/ZoomWindow.app
/System/Library/CoreServices/backupd.bundle/Contents/Resources/TMLaunchAgent.app
/System/Library/CoreServices/loginwindow.app
/System/Library/CoreServices/rcd.app
/System/Library/Frameworks/PubSub.framework/Versions/A/Resources/PubSubAgent.app
/System/Library/Frameworks/Quartz.framework/Versions/A/Frameworks/QuickLookUI.framework/Versions/A/Resources/QuickLookUIHelper.app
/System/Library/Frameworks/QuickLook.framework/Versions/A/Resources/quicklookd.app
/System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/Resources/DiskImages UI Agent.app
/System/Library/Services/AppleSpell.service
/System/Library/Services/ChineseTextConverterService.app
/System/Library/Services/ImageCaptureService.app
/System/Library/Services/OpenSpell.service
/System/Library/Services/SpeechService.service
/System/Library/SocialServices/Facebook.socialplugin
/System/Library/SocialServices/Twitter.socialplugin
/System/Library/SocialServices/Weibo.socialplugin

person Johannes Weiss    schedule 01.03.2013    source источник
comment
Я знаю, что это возможно, потому что RCDefaultApp делает это, но я тоже не знаю, как это сделать.   -  person zneak    schedule 01.03.2013


Ответы (3)


Во-первых, ваш запрос не совсем правильный:

Я ищу решение для перечисления всех приложений, установленных в системе (Mac) OS X, то есть всех пакетов приложений, зарегистрированных в LaunchServices.

Это не одно и то же. Пакеты приложений, зарегистрированные в LaunchServices, являются выходными данными lsregister -dump. Это не то же самое, что «все приложения установлены». Точного запроса «все приложения установлены» не существует. OS X даже не имеет такой концепции.

Вывод system_profiler эквивалентен тому, что известно Spotlight. Это не совсем полный список установленных приложений, и в некоторых случаях он может быть неверным. Например, Spotlight мог быть отключен или не завершил свое первое сканирование. (Нет поддерживаемого способа спросить Spotlight, завершил ли он свое первое сканирование; радар 15177626.)

Существует также pkgutil --pkgs, который предоставит вам дополнительные «установленные вещи». Он также неполный и может содержать список вещей, которые не установлены.

Вы также можете использовать mdfind для обхода всего диска и просмотра того, что называет себя приложением. Это довольно эффективно, но медленно.

Вы также можете использовать locate .app | grep '\.app$', что довольно эффективно, если база данных локации обновлена ​​и вам нужны только пакеты приложений.

Я спросил Apple об этом на WWDC. Нет простого, поддерживаемого ответа. Откройте радар. Вы можете попросить обмануть 15177489.

person Rob Napier    schedule 08.10.2013
comment
моя проблема с подходами на основе find, mdfind, locate заключается в том, что они будут перечислять пакеты .App, используемые внутри установленными приложениями (XCode.app). По сравнению с этим даже ls -1 /Applications ближе к реальности. - person minusf; 10.02.2020

в терминале:

system_profiler SPApplicationsDataType > list_of_all_apps.txt

... записывает вывод запроса system_profiler в этот текстовый файл.

person Rowe Morehouse    schedule 01.04.2015

Как насчет использования приложения/кода Cocoa, как это сделано здесь.

Кроме того, вы можете использовать system_profiler -xml SPApplicationsDataType, а затем проанализировать полученные XML-данные, чтобы получить только интересующие вас приложения.

person Anoop Vaidya    schedule 02.03.2013
comment
сегодня узнал, что lsregister все равно набирает больше, чем system_profiler :-( . - person Johannes Weiss; 08.10.2013