OS Xのターミナルから特定のファイルタイプのすべてのファイルのデフォルトアプリを変更するにはどうすればよいですか?
もっと簡単な方法があります。必要な場合は Homebrew をお持ちでない場合:
/usr/bin/Ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
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
~/Library/Preferences/com.Apple.LaunchServices.plist
を編集します。
LSHandlers
の下に、UTI(キーLSHandlerContentType
、たとえばpublic.plain-text
)とアプリケーションバンドル識別子(LSHandlerRoleAll
、たとえばcom.macromates.textmate
)を含むエントリを追加します。
Property List Editorでは次のようになります。
コマンドラインからこれを行うには、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