OS X'deki terminal aracılığıyla belirli dosya türündeki tüm dosyalar için varsayılan uygulama nasıl değiştirilir?


32

Belirli bir dosya türündeki tüm dosyalar için varsayılan uygulamayı OS X'deki Terminal aracılığıyla nasıl değiştirebilirim?


Dupe değil , cevapladığım halde. Bunun için üzgünüm.
Daniel Beck

Güç kullanımı için, daha yeni bir Süper Kullanıcı sorusu altında kabul edilen yanıtı beğendim, OS X'te dosya türleriyle ilişkili varsayılan uygulamaları değiştirmenin daha hızlı bir yolu var mı? . Kolaylık olması açısından, gibi aşağıda Daniel'in cevabı .
Graham Perrin

Yanıtlar:


39

Daha basit bir yolum var. Zaten sahip değilseniz, Homebrew'i isteyeceksiniz :

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

Duti yükleyin:

brew install duti

Şimdi kullanmak istediğiniz uygulamanın kimliğini bulmanız ve onu kullanmak istediğiniz uzantıya atamanız gerekir. Bu örnekte, Parantez için zaten kullanıyorum *.shve ayrıca *.mdxcode yerine dosyalar için de kullanmak istiyorum .

.shDosyalar için varsayılan uygulama kimliğini alın :

duti -x sh

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

Son satır kimliğidir.

Tüm .mddosyalar için bu uygulama kimliğini kullanın :

duti -s io.brackets.appshell .md all

3
Eğer yapabilseydim bunu 50 kez daha fazla oylardı. Harika bilgi El Capitan'da benim için bir cazibe gibi çalıştı.
Ryan Walls,

1
Sierra'da da çalışmak. Ekstra ipucu: UTI'ler bir acıdır, ancak belirli bir dosyanın UTI'sini bulmak için "mdls -name kMDItemContentType <dosya>" kullanabilirsiniz (ve bu nedenle uzantısı).
Adrian

2
Bir uygulamayı bu şekilde bir şeyle ilişkilendirmediyseniz ancak uygulamanızın adını biliyorsanız, osascript -e 'id of app "$appName"'sisteminizde yüklü herhangi bir uygulamanın kimliğini almak için yapabilirsiniz
GrayedFox 11:17 'de

1
Referans için: @GrayedFox öğesinin duti ile birleştirilmesi:duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
Strajk

18

Düzen ~/Library/Preferences/com.apple.LaunchServices.plist.

Bir giriş altında ekleyin LSHandlersidrar yolu enfeksiyonu (anahtarını içeren, LSHandlerContentTypeörneğin public.plain-text() ve uygulama paket tanımlayıcı LSHandlerRoleAll, örneğincom.macromates.textmate ) .

Özellik Listesi Düzenleyicisi'nde şöyle görünür :

alt metin alt metin

Bunu komut satırından yapmak için defaultsveya tuşunu kullanın./usr/libexec/PlistBuddy . Her ikisinde de geniş man sayfaları var.

Örneğin, tüm .plistdosyaları kullanarak Xcodeşunları açmak için :

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

Tabii ki, UTI için zaten başka bir giriş olmadığından emin olmanız gerekir. com.apple.property-list zaten orada .

İşte bir UTI için mevcut girişleri kaldıracak ve yeni bir tane ekleyecek daha eksiksiz bir script. Yalnızca işleyebilir LSHandlerContentTypeve her zaman ayarlayacaktır LSHandlerRoleAllve parametreler yerine kodlanmış paket kimlikleri vardır. Bunun dışında oldukça iyi çalışması gerekir.

#!/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
En kolay yol muhtemelen x=~/Library/Preferences/com.apple.LaunchServices.plist; plutil -convert xml1 $x; open -a TextEdit $xbu LSHandlers girişlerini kopyalayıp yapıştırmaktır. Paket tanımlayıcısını almak için yapabilirsiniz osascript -e 'bundle identifier of (info for (path to app "TextEdit"))'.
Lri,

@ Bir şekilde, evet, ama bu soru özellikle komut satırı ile ilgili. TextEdit'in (veya Özellik Listesi Düzenleyicisinin / Xcode) kalifiye olmadığını; Ben sadece örnekleme amacıyla diğer cevabımdan Property List Editor ile o kısmı kopyaladım. Paket tanımlayıcısında yararlı yorumlar.
Daniel Beck

Daniel'e kredi olarak, Senden Farklı Sor, Can Finder ve “open” komutundaki bir soruyu cevaplamak için ödünç aldım. .
Graham Perrin

Orada ise yok İYE için alternatif bir giriş var, bunu "bir diziden tek sözlüğün komut satırı çıkarılması gereksiz yere zor olabilir" kabul edeceğini?
Graham Perrin

1
@GrahamPerrin Gereksiz yere zordur çünkü defaultsbunu yapabilecek kapasitede görünmüyor ve birkaç PlistBuddyçağrı gerektiriyor . Ancak tekrar kullanılabilir bir kabuk betiğinde bunu yapmak mümkündür.
Daniel Beck
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.