48 votes

Comment changer l'application par défaut pour tous les fichiers d'un type particulier via le terminal dans OS X ?

Comment modifier l'application par défaut pour tous les fichiers d'un type particulier via le Terminal dans OS X ?

64voto

yasin Points 131

J'ai une solution plus simple. Vous devez Homebrew si vous ne l'avez pas encore :

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

Installer le duti :

brew install duti

Vous devez maintenant trouver l'identifiant de l'application que vous souhaitez utiliser et l'affecter à l'extension pour laquelle vous souhaitez l'utiliser. Dans cet exemple, j'utilise déjà Brackets pour *.sh et je veux aussi l'utiliser pour *.md au lieu de xcode.

Obtenir l'identifiant de l'application par défaut pour .sh des dossiers :

duti -x sh

output:
  Brackets.app
  /opt/homebrew-cask/Caskroom/brackets/1.6/Brackets.app
  io.brackets.appshell

La dernière ligne est l'identifiant.

Utiliser cette application pour tous .md des dossiers :

duti -s io.brackets.appshell .md all

19voto

Daniel Beck Points 105590

Editer ~/Library/Preferences/com.apple.LaunchServices.plist .

Ajouter une entrée sous LSHandlers contenant l'infection urinaire (clé LSHandlerContentType , par exemple public.plain-text ) et l'identifiant du paquet d'applications ( LSHandlerRoleAll , par exemple com.macromates.textmate ).

Il se présente comme suit Éditeur de liste de propriétés :

alt textalt text

Pour ce faire à partir de la ligne de commande, utilisez defaults o /usr/libexec/PlistBuddy . Les deux ont des pages de manuel détaillées.

Par exemple, pour ouvrir tous les .plist à l'aide de Xcode :

defaults write com.apple.LaunchServices LSHandlers -array-add '{ LSHandlerContentType = "com.apple.property-list"; LSHandlerRoleAll = "com.apple.dt.xcode"; }'

Bien entendu, il faut s'assurer qu'il n'existe pas déjà une autre entrée pour l'infection urinaire. com.apple.property-list déjà à l'intérieur.

Voici un script plus complet qui supprimera les entrées existantes pour un UTI et en ajoutera une nouvelle. Il ne peut gérer que les LSHandlerContentType et fixera toujours LSHandlerRoleAll et a codé en dur les identifiants des paquets au lieu des paramètres. Pour le reste, cela devrait fonctionner assez bien.

#!/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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X