Wie kann ich die Standard-App für alle Dateien eines bestimmten Dateityps über das Terminal in OS X ändern?
Wie kann ich die Standard-App für alle Dateien eines bestimmten Dateityps über das Terminal in OS X ändern?
Antworten:
Ich habe einen einfacheren Weg. Du wirst Homebrew wollen, wenn du es noch nicht hast:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install duti
Jetzt müssen Sie die ID der App finden, die Sie verwenden möchten, und sie der Erweiterung zuweisen, für die Sie sie verwenden möchten. In diesem Beispiel verwende ich bereits Brackets für *.sh
und möchte es auch für *.md
Dateien anstelle von xcode verwenden.
.sh
Dateien ab:duti -x sh
output:
Brackets.app
/opt/homebrew-cask/Caskroom/brackets/1.6/Brackets.app
io.brackets.appshell
Die letzte Zeile ist die ID.
.md
Dateien:duti -s io.brackets.appshell .md all
osascript -e 'id of app "$appName"'
die ID jeder App ermitteln, die auf Ihrem System installiert ist
duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
Bearbeiten ~/Library/Preferences/com.apple.LaunchServices.plist
.
Fügen Sie unter einen Eintrag hinzu LSHandlers
, der die UTI ( LSHandlerContentType
z. B. Schlüssel public.plain-text
) und die Anwendungspaket-ID ( LSHandlerRoleAll
z com.macromates.textmate
. B. ) enthält.
Es sieht so aus in Eigenschaftenlisten-Editor aus :
Verwenden Sie dazu in der Befehlszeile defaults
oder /usr/libexec/PlistBuddy
. Beide haben umfangreiche Hilfeseiten.
Zum Beispiel, um alle .plist
Dateien mit zu öffnenXcode
:
defaults write com.apple.LaunchServices LSHandlers -array-add '{ LSHandlerContentType = "com.apple.property-list"; LSHandlerRoleAll = "com.apple.dt.xcode"; }'
Natürlich müssen Sie sicherstellen, dass noch kein Eintrag für die UTI com.apple.property-list
vorhanden ist.
Hier ist ein vollständigeres Skript, mit dem vorhandene Einträge für eine UTI entfernt und neue hinzugefügt werden. Es kann nur Bündel-IDs anstelle von Parametern verarbeiten LSHandlerContentType
und wird immer festgelegt LSHandlerRoleAll
und verfügt über fest codierte Bündel-IDs. Ansonsten sollte es ganz gut funktionieren.
#!/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
x=~/Library/Preferences/com.apple.LaunchServices.plist; plutil -convert xml1 $x; open -a TextEdit $x
diese LSHandlers-Einträge zu kopieren und einzufügen. Um die Bundle-ID zu erhalten, können Sie Folgendes tun osascript -e 'bundle identifier of (info for (path to app "TextEdit"))'
.
defaults
es nicht in der Lage zu sein scheint, und es erfordert ein paar PlistBuddy
Anrufe. Es ist jedoch möglich, dies in einem wiederverwendbaren Shell-Skript zu tun.