安装 duti:

安装 duti:

如何通过 OS X 中的终端更改特定文件类型的所有文件的默认应用程序?

答案1

我有一个更简单的方法。你会想要自制如果你还没有:

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

安装 duti:

brew install duti

现在您需要找到要使用的应用程序的 ID,并将其分配给要使用它的扩展。在此示例中,我已经使用了 Brackets,*.sh并且我还想将它用于*.md文件而不是 xcode。

获取文件的默认应用程序 ID .sh

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

答案2

编辑~/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"; }'

当然,您需要确保com.apple.property-list其中还没有另一个 UTI 条目。

这是一个更完整的脚本,它将删除 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

dutis 是 duti 的包装器,提供一种在命令行中设置默认应用程序的交互方式。

您可以使用 dutis 仅需几个步骤设置默认应用程序:

等待环境检查

在此处输入图片描述

选择后缀

在此处输入图片描述

选择应用程序 UTI

在此处输入图片描述

相关内容