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

32

Comment puis-je changer l'application par défaut pour tous les fichiers d'un type de fichier particulier via le terminal sous OS X?

yashodhan
la source
Pas dupe, même si j'y ai répondu. Désolé pour ça.
Daniel Beck
Pour la consommation d'énergie, j'aime la réponse acceptée sous une question plus récente de super utilisateur, existe-t-il un moyen plus rapide de modifier les applications par défaut associées aux types de fichiers sur OS X? . Pour plus de simplicité, j'aime la réponse de Daniel ci-dessous .
Graham Perrin

Réponses:

39

J'ai une manière plus simple. Vous voudrez Homebrew si vous ne l'avez pas déjà:

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

Installez duti:

brew install duti

Vous devez maintenant trouver l'ID de l'application que vous souhaitez utiliser et l'attribuer à l'extension pour laquelle vous souhaitez l'utiliser. Dans cet exemple, j'utilise déjà des supports pour *.shet je veux également l'utiliser pour des *.mdfichiers au lieu de xcode.

Obtenez l'ID d'application par défaut pour les .shfichiers:

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.

Utilisez cet identifiant d'application pour tous les .mdfichiers:

duti -s io.brackets.appshell .md all
brûlures mates
la source
3
Je voterais 50 fois si je le pouvais. Grande info. A fonctionné comme un charme pour moi à El Capitan.
Ryan Walls
1
Travailler à Sierra aussi. Astuce supplémentaire: les UTI sont un problème, mais vous pouvez utiliser "mdls -name kMDItemContentType <file>" pour trouver l'UTI pour un fichier donné (et donc une extension).
Adrian
2
Si vous n'avez pas déjà associé une application à quelque chose de cette façon mais que vous connaissez le nom de votre application, vous pouvez faire osascript -e 'id of app "$appName"'pour obtenir l'ID de n'importe quelle application installée sur votre système
GrayedFox
1
Juste pour la référence: combiner la pointe de @GrayedFox avec duti:duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
Strajk
18

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

Ajoutez une entrée sous LSHandlers, contenant l'UTI (clé LSHandlerContentType, par exemple public.plain-text) et l'identifiant du bundle d'application ( LSHandlerRoleAll, par exemple com.macromates.textmate).

Il ressemble à ceci dans l' éditeur de liste de propriétés :

texte alternatif texte alternatif

Pour ce faire à partir de la ligne de commande, utilisez defaultsou /usr/libexec/PlistBuddy. Les deux ont de nombreuses pages de manuel.

Par exemple pour ouvrir tous les .plistfichiers en utilisant Xcode:

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

Bien sûr, vous devez vous assurer qu'il n'y a pas déjà une autre entrée pour l'UTI com.apple.property-listlà-dedans.

Voici un script plus complet qui supprimera les entrées existantes pour une UTI et en ajoutera une nouvelle. Il ne peut gérer LSHandlerContentTypeet sera toujours défini LSHandlerRoleAll, et a des ID de paquet codés en dur au lieu de paramètres. En dehors de cela, 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
Daniel Beck
la source
3
Le moyen le plus simple consiste probablement à x=~/Library/Preferences/com.apple.LaunchServices.plist; plutil -convert xml1 $x; open -a TextEdit $xcopier et coller ces entrées LSHandlers. Pour obtenir l'identifiant du bundle, vous pouvez le faire osascript -e 'bundle identifier of (info for (path to app "TextEdit"))'.
Lri
@Lri D'une certaine manière, oui, mais cette question concerne spécifiquement la ligne de commande. J'ai pensé que TextEdit (ou l'éditeur de liste de propriétés / Xcode) ne se qualifie pas; Je viens de copier cette partie avec l'éditeur de liste de propriétés de mon autre réponse à des fins d'illustration. Remarque utile sur l'identifiant du bundle.
Daniel Beck
Mention à Daniel, j'ai emprunté à cela une réponse à une question dans Ask Different, Can Finder et la commande «open» traitent les fichiers avec .sh ou d'autres extensions typiques comme les fichiers .command? .
Graham Perrin
S'il n'existe une autre entrée pour l'infection urinaire, seriez - vous d' accord que « la suppression de la ligne de commande d'un dictionnaire unique d'un tableau peut être inutilement difficile »?
Graham Perrin
1
@GrahamPerrin C'est inutilement difficile car defaultsne semble pas être capable de le faire, et cela nécessite quelques PlistBuddyappels. Mais il est possible de le faire dans un script shell réutilisable.
Daniel Beck