2013-03-01 14 views
7

Podstawowym problemem

szukam rozwiązania wyliczyć wszystkie zainstalowane na (Mac) OS X aplikacji systemu, to znaczy wszystkie pakiety aplikacji zarejestrowanych z LaunchServices.Wyliczanie wszystkich zainstalowanych aplikacji na OS X

Proste podejście, które nie działa

(Uwaga: lsregister można znaleźć pod /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister).

Obecnie używam wyjście lsregister -dump | grep -E '^.*[ \\t]*path:[ \\t]+(\/.*)$' | grep -Eo '\/.*', która ma kilka problemów:

  • .app wiązek z nowymi liniami (\n, co jest ważne w systemie UNIX) nie są obsługiwane poprawnie (Ten problem będzie naprawić przez piśmie odpowiedni analizator składni)
  • lsregister nie obsługuje poprawnie dziwnej nazwy pliku (np. zawierającej RTL mark). lsregister wydaje się ignorować pliki ze znakiem RTL w ich nazwie. Jeśli chcesz, możesz utworzyć plik z RTL w jego nazwie, uruchamiając następujące polecenie.

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

    Po wykonaniu tej czynności, lsregister -dump | grep ThisIsAWeird będzie nie ujawniać go. Ale kiedy klikniesz prawym przyciskiem myszy plik tekstowy i klikniesz "Otwórz za pomocą", to LaunchServices i Finder nadal będą obsługiwać ten plik. see yourself

Wystarczy wyliczanie wszystkich plików w /Applications i inne katalogi nie działa, ponieważ jest świadoma LaunchServices wiązek zastosowania w dowolnych folderów i ja też trzeba te aplikacje.

Inne approch że nie dostać się do pracy

Najwyraźniej istnieje prywatna funkcja API o nazwie _LSFindApplications który robi dokładnie to, co trzeba zrobić, ale nie mogę zmusić go do pracy i nie znaleźliśmy żadnych nieoficjalna dokumentacja w Internecie. (Dowód istnieje: nm /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/LaunchServices | grep __LSFindApplications$)

UPDATE: metoda system_profiler również nie wydają się działać

Do tej pory I chociaż metoda system_profiler jak sugeruje @Anoop prace ale dziś okazało się, że lsregister jeszcze bardziej podnosi pliki binarne. Niektóre lub brakujące na wszystkich komputerach, niektóre wydają się być nieobecne tylko w system_profiler po zamontowaniu zewnętrznego woluminu z inną instalacją OS X. Oto lista, której brakuje na wyjściu system_profiler (ale jest obecna w lsregister) na jednym z moich maszyny:

/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 
+1

Wiem, że jest to możliwe, ponieważ RCDefaultApp robi to, ale ja też nie wiem jak. – zneak

Odpowiedz

4

Po pierwsze, wniosek nie ma rację:

szukam rozwiązania wyliczyć wszystkie zainstalowane na (Mac) OS X aplikacji systemu, to znaczy wszystkie pakiety aplikacji zarejestrowanych z LaunchServices.

To nie to samo. Pakiety aplikacji zarejestrowane w LaunchServices są danymi wyjściowymi z lsregister -dump. To nie jest to samo, co "wszystkie zainstalowane aplikacje". Nie ma dokładnego zapytania o "wszystkie zainstalowane aplikacje". OS X tak naprawdę nie ma takiej koncepcji.

Dane wyjściowe z system_profiler są równoważne wynikom, o których wie Spotlight. To nie jest dokładnie pełna lista zainstalowanych aplikacji i może nie być poprawna w kilku przypadkach. Spotlight mógł na przykład zostać wyłączony lub być może nie zakończył pierwszego skanowania. (Nie ma obsługiwanego sposobu, aby zapytać Spotlight, jeśli zakończył swój pierwszy skan, radar 15177626.)

Istnieje również pkgutil --pkgs, który zapewni Ci dodatkowe "zainstalowane rzeczy". Nie jest kompletny i może zawierać listę rzeczy, które nie są zainstalowane.

Możesz także użyć mdfind, aby przejść cały dysk i zobaczyć, co nazywa się aplikacją. Jest to dość skuteczne, ale powolne.

Możesz także użyć locate .app | grep '\.app$', która jest całkiem skuteczna, jeśli zlokalizowana baza danych jest aktualna i chcesz tylko pakiety aplikacji.

Zapytałem Apple o to na WWDC. Nie ma prostej, obsługiwanej odpowiedzi. Otwórz radar. Można poprosić o dupe 15177489.

1

co znaleźć za pomocą Cocoa aplikacji/kod jak zrobić here.

Możesz także użyć narzędzia system_profiler -xml SPApplicationsDataType, a następnie przeanalizować wynikowe dane XML, aby uzyskać tylko te aplikacje, które są dla Ciebie interesujące.

+0

dowiedziałem się, że 'lsregister' nadal pobiera więcej niż' system_profiler' :-(. –

1

w terminalu:

system_profiler SPApplicationsDataType > list_of_all_apps.txt

... pisze wyjście zapytania system_profiler do tego pliku tekstowego.