OS X에서 터미널을 통해 특정 파일 형식의 모든 파일에 대한 기본 앱을 변경하는 방법은 무엇입니까?


32

OS X의 터미널을 통해 특정 파일 형식의 모든 파일에 대한 기본 앱을 어떻게 변경합니까?


나는 거기에 대답했지만 , 속임수가 아닙니다 . 미안합니다.
Daniel Beck

답변:


39

더 간단한 방법이 있습니다. Homebrew가 없으면 Homebrew를 원할 것입니다.

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

듀티 설치 :

brew install duti

이제 사용하려는 앱의 ID를 찾아서 사용하려는 확장 프로그램에 할당해야합니다. 이 예제에서는 이미 대괄호를 *.sh사용하고 *.mdxcode 대신 파일에 대괄호를 사용 하고 싶습니다 .

.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

3
내가 할 수 있다면 이걸 50 번 찬성 하겠어. 훌륭한 정보. 엘 캐피 탄에서 저를위한 매력처럼 일했습니다.
Ryan Walls

1
시에라에서도 일하고 ​​있습니다. 추가 팁 : UTI는 고통 스럽지만 "mdls -name kMDItemContentType <file>"을 사용하여 지정된 파일 (및 확장명)의 UTI를 찾을 수 있습니다.
Adrian

2
이 방법으로 앱을 아직 연결하지 않았지만 앱 이름을 알고 osascript -e 'id of app "$appName"'있다면 시스템에 설치된 앱의 ID를 얻을 수 있습니다.
GrayedFox

1
참고로 : @GrayedFox의 팁을 duti와 결합 :duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
Strajk

18

편집 ~/Library/Preferences/com.apple.LaunchServices.plist.

아래 항목 추가 LSHandlersUTI (키를 포함하는 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

3
가장 쉬운 방법은 아마도 x=~/Library/Preferences/com.apple.LaunchServices.plist; plutil -convert xml1 $x; open -a TextEdit $xLSHandlers 항목을 복사하여 붙여 넣는 것입니다 . 번들 식별자를 얻으려면 할 수 있습니다 osascript -e 'bundle identifier of (info for (path to app "TextEdit"))'.
Lri

@Lri 어떤 식 으로든이 질문은 명령 행에 관한 것입니다. TextEdit (또는 속성 목록 편집기 / Xcode)이 자격이 없다는 것을 알았습니다. 방금 설명을 위해 다른 답변의 속성 목록 편집기를 사용하여 해당 부분을 복사했습니다. 번들 식별자에 대한 유용한 설명입니다.
Daniel Beck

Daniel에게 감사의 말을 전합니다 . Ask Different, Can Finder 의 질문에 대한 답변 으로 이것을 빌 렸습니다 .“open”명령은 .sh 또는 .command 파일과 같은 다른 일반적인 확장자를 가진 파일을 처리합니까? .
Graham Perrin

이 경우 않습니다 UTI에 대한 대체 항목을 존재, 그 "배열에서 하나의 사전의 명령 행 제거가 불필요하게 어려울 수있다"동의?
Graham Perrin

1
@GrahamPerrin 할 수없는 것처럼 보이기 때문에 불필요하게 어렵고 defaults몇 번의 PlistBuddy호출 이 필요 합니다. 그러나 재사용 가능한 셸 스크립트로 수행 할 수 있습니다.
Daniel Beck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.