web-dev-qa-db-ja.com

OS Xのターミナルから特定のファイルタイプのすべてのファイルのデフォルトアプリを変更する方法

OS Xのターミナルから特定のファイルタイプのすべてのファイルのデフォルトアプリを変更するにはどうすればよいですか?

35
yashodhan

もっと簡単な方法があります。必要な場合は Homebrew をお持ちでない場合:

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

Dutiをインストールします。

brew install duti

次に、使用するアプリのIDを見つけ、それを使用する拡張機能に割り当てる必要があります。この例では、*.shにブラケットを既に使用しており、xcodeの代わりに*.mdファイルにも使用したいと思います。

.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
44
matt burns

~/Library/Preferences/com.Apple.LaunchServices.plistを編集します。

LSHandlersの下に、UTI(キーLSHandlerContentType、たとえばpublic.plain-text)とアプリケーションバンドル識別子(LSHandlerRoleAll、たとえばcom.macromates.textmate)を含むエントリを追加します。

Property List Editorでは次のようになります。

alt textalt text

コマンドラインからこれを行うには、defaultsまたは/usr/libexec/PlistBuddyを使用します。どちらにも広範なマンページがあります。

たとえば、Xcodeを使用してすべての.plistファイルを開くには:

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
18
Daniel Beck