OS X의 터미널을 통해 특정 파일 형식의 모든 파일에 대한 기본 앱을 어떻게 변경합니까?
OS X의 터미널을 통해 특정 파일 형식의 모든 파일에 대한 기본 앱을 어떻게 변경합니까?
답변:
더 간단한 방법이 있습니다. Homebrew가 없으면 Homebrew를 원할 것입니다.
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install duti
이제 사용하려는 앱의 ID를 찾아서 사용하려는 확장 프로그램에 할당해야합니다. 이 예제에서는 이미 대괄호를 *.sh
사용하고 *.md
xcode 대신 파일에 대괄호를 사용 하고 싶습니다 .
.sh
파일 의 기본 앱 ID를 가져 옵니다.duti -x sh
output:
Brackets.app
/opt/homebrew-cask/Caskroom/brackets/1.6/Brackets.app
io.brackets.appshell
마지막 줄은 id입니다.
.md
파일 에이 앱 ID를 사용하십시오 .duti -s io.brackets.appshell .md all
osascript -e 'id of app "$appName"'
있다면 시스템에 설치된 앱의 ID를 얻을 수 있습니다.
duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
편집 ~/Library/Preferences/com.apple.LaunchServices.plist
.
아래 항목 추가 LSHandlers
UTI (키를 포함하는 LSHandlerContentType
, 예를 들면 public.plain-text
) 애플리케이션 번들의 식별자 ( LSHandlerRoleAll
예를 com.macromates.textmate
).
속성 목록 편집기 에서 다음과 같이 보입니다 .
명령 줄에서이 작업을 수행하려면 사용 defaults
또는 /usr/libexec/PlistBuddy
. 둘 다 광범위한 맨 페이지가 있습니다.
예를 들어 모든 엽니 다 .plist
사용하여 파일을 Xcode
:
defaults write com.apple.LaunchServices LSHandlers -array-add '{ LSHandlerContentType = "com.apple.property-list"; LSHandlerRoleAll = "com.apple.dt.xcode"; }'
물론 UTI에 com.apple.property-list
이미 다른 항목이 없는지 확인해야합니다 .
다음은 UTI에 대한 기존 항목을 제거하고 새 항목을 추가하는보다 완전한 스크립트입니다. 처리 할 수 LSHandlerContentType
있고 항상 설정 LSHandlerRoleAll
되며 매개 변수 대신 하드 코드 된 번들 ID가 있습니다. 그 외에는 꽤 잘 작동합니다.
#!/usr/bin/env bash
PLIST="$HOME/Library/Preferences/com.apple.LaunchServices.plist"
BUDDY=/usr/libexec/PlistBuddy
# the key to match with the desired value
KEY=LSHandlerContentType
# the value for which we'll replace the handler
VALUE=public.plain-text
# the new handler for all roles
HANDLER=com.macromates.TextMate
$BUDDY -c 'Print "LSHandlers"' $PLIST >/dev/null 2>&1
ret=$?
if [[ $ret -ne 0 ]] ; then
echo "There is no LSHandlers entry in $PLIST" >&2
exit 1
fi
function create_entry {
$BUDDY -c "Add LSHandlers:$I dict" $PLIST
$BUDDY -c "Add LSHandlers:$I:$KEY string $VALUE" $PLIST
$BUDDY -c "Add LSHandlers:$I:LSHandlerRoleAll string $HANDLER" $PLIST
}
declare -i I=0
while [ true ] ; do
$BUDDY -c "Print LSHandlers:$I" $PLIST >/dev/null 2>&1
[[ $? -eq 0 ]] || { echo "Finished, no $VALUE found, setting it to $HANDLER" ; create_entry ; exit ; }
OUT="$( $BUDDY -c "Print 'LSHandlers:$I:$KEY'" $PLIST 2>/dev/null )"
if [[ $? -ne 0 ]] ; then
I=$I+1
continue
fi
CONTENT=$( echo "$OUT" )
if [[ $CONTENT = $VALUE ]] ; then
echo "Replacing $CONTENT handler with $HANDLER"
$BUDDY -c "Delete 'LSHandlers:$I'" $PLIST
create_entry
exit
else
I=$I+1
fi
done
x=~/Library/Preferences/com.apple.LaunchServices.plist; plutil -convert xml1 $x; open -a TextEdit $x
LSHandlers 항목을 복사하여 붙여 넣는 것입니다 . 번들 식별자를 얻으려면 할 수 있습니다 osascript -e 'bundle identifier of (info for (path to app "TextEdit"))'
.
defaults
몇 번의 PlistBuddy
호출 이 필요 합니다. 그러나 재사용 가능한 셸 스크립트로 수행 할 수 있습니다.