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


32

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


私はそこに答えたのに、だまされていません。ごめんなさい
ダニエルベック

回答:


39

もっと簡単な方法があります。あなたは欲しいよ自作をあなたはすでにそれを持っていない場合:

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

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

brew install duti

次に、使用するアプリのIDを見つけて、それを使用する拡張機能に割り当てる必要があります。この例では、すでにBracketsを*.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

3
できればこれを50回支持します。素晴らしい情報。エルキャピタンで私にとって魅力的な仕事をしました。
ライアンウォールズ

1
シエラでも働いています。追加のヒント:UTIは苦痛ですが、「mdls -name kMDItemContentType <file>」を使用して、指定されたファイル(および拡張子)のUTIを見つけることができます。
エイドリアン

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 $xこれらのLSHandlersエントリをコピーして貼り付けることです。バンドル識別子を取得するには、次のようにしますosascript -e 'bundle identifier of (info for (path to app "TextEdit"))'
LRI

@Lriある意味では、そうですが、この質問は特にコマンドラインに関するものです。TextEdit(またはProperty List Editor / Xcode)は資格がないと考えました。説明のために、他の回答からProperty List Editorでその部分をコピーしました。バンドル識別子に関する有用な発言。
ダニエルベック


UTIの代替エントリ存在する場合、「配列から単一の辞書をコマンドラインで削除するのは不必要に難しいかもしれない」ことに同意しますか?
グラハムペリン

1
@GrahamPerrinそれはそれを行うことができないようであり、それはいくつかの呼び出しを必要とするため、不必要に難しいdefaultsですPlistBuddy。ただし、再利用可能なシェルスクリプトで実行することは可能です。
ダニエルベック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.