ओएस एक्स में टर्मिनल के माध्यम से विशेष रूप से फ़ाइल प्रकार की सभी फ़ाइलों के लिए डिफ़ॉल्ट ऐप कैसे बदलें?


32

मैं ओएस एक्स में टर्मिनल के माध्यम से किसी विशेष फ़ाइल प्रकार की सभी फ़ाइलों के लिए डिफ़ॉल्ट ऐप कैसे बदल सकता हूं?


मैं एक प्रकार का दुपट्टा नहीं, भले ही मैंने वहां इसका उत्तर दिया हो। उसके लिए माफ़ करना।
डैनियल बेक

बिजली के उपयोग के लिए, मुझे अधिक हाल के सुपर उपयोगकर्ता प्रश्न के तहत स्वीकृत उत्तर पसंद है , क्या ओएस एक्स के साथ फ़ाइल प्रकारों से जुड़े डिफ़ॉल्ट एप्लिकेशन को बदलने का एक तेज़ तरीका है? । सादगी के लिए, मुझे नीचे डैनियल का जवाब पसंद है ।
ग्राहम पेरिन

जवाबों:


39

मेरे पास एक सरल तरीका है। यदि आप पहले से ही यह नहीं चाहते हैं तो आप Homebrew चाहते हैं :

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

डूटी स्थापित करें:

brew install duti

अब आपको उस ऐप की आईडी ढूंढनी होगी जिसका आप उपयोग करना चाहते हैं, और इसे उस एक्सटेंशन पर असाइन करें जिसे आप इसके लिए उपयोग करना चाहते हैं। इस उदाहरण में, मैं पहले से ही ब्रैकेट का उपयोग करता *.shहूं और मैं इसे *.mdxcode के बजाय फ़ाइलों के लिए भी उपयोग करना चाहता हूं ।

.shफ़ाइलों के लिए डिफ़ॉल्ट ऐप आईडी प्राप्त करें:

duti -x sh

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

अंतिम पंक्ति आईडी है।

सभी .mdफ़ाइलों के लिए इस ऐप आईडी का उपयोग करें :

duti -s io.brackets.appshell .md all

3
अगर मैं कर सकता तो यह 50 बार बढ़ेगा। बढ़िया जानकारी। एल कैपिटन में मेरे लिए एक आकर्षण की तरह काम किया।
रयान वॉल्स

1
सिएरा में भी काम कर रहे हैं। अतिरिक्त टिप: यूटीआई एक दर्द है, लेकिन आप किसी दिए गए फ़ाइल (और इसलिए एक्सटेंशन) के लिए यूटीआई को खोजने के लिए "mdls -name kMDItemContentType <file>" का उपयोग कर सकते हैं।
एड्रियन

2
यदि आप पहले से किसी ऐप को इस तरह से संबद्ध नहीं करते हैं, लेकिन अपने ऐप का नाम जानते हैं, तो आप osascript -e 'id of app "$appName"'अपने सिस्टम पर इंस्टॉल किए गए किसी भी ऐप की आईडी प्राप्त करने के लिए कर सकते हैं
ग्रेडफ़ॉक्स

1
: बस में संदर्भ के लिए: Duti साथ @GrayedFox से टिप के संयोजनduti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
Strajk

18

संपादित करें ~/Library/Preferences/com.apple.LaunchServices.plist

LSHandlersUTI (कुंजी 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पहले से ही यूटीआई के लिए एक और प्रविष्टि नहीं है।

यहां एक अधिक संपूर्ण स्क्रिप्ट है जो एक यूटीआई के लिए मौजूदा प्रविष्टियों को हटा देगा और एक नया जोड़ देगा। यह केवल संभाल सकता है LSHandlerContentType, और हमेशा सेट करेगा LSHandlerRoleAll, और मापदंडों के बजाय हार्ड-कोडेड बंडल आईडी है। इसके अलावा, यह काफी अच्छी तरह से काम करना चाहिए।

#!/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
सबसे आसान तरीका शायद x=~/Library/Preferences/com.apple.LaunchServices.plist; plutil -convert xml1 $x; open -a TextEdit $xउन LSHandlers प्रविष्टियों को कॉपी और पेस्ट करना है। बंडल पहचानकर्ता प्राप्त करने के लिए आप कर सकते हैं osascript -e 'bundle identifier of (info for (path to app "TextEdit"))'
लैरी

@Lri एक तरह से, हाँ, लेकिन यह प्रश्न विशेष रूप से कमांड लाइन के बारे में है। मुझे लगा कि TextEdit (या संपत्ति सूची संपादक / Xcode) योग्य नहीं है; मैंने चित्रण प्रयोजनों के लिए अपने दूसरे उत्तर से संपत्ति सूची संपादक के साथ उस हिस्से की नकल की। बंडल पहचानकर्ता पर उपयोगी टिप्पणी।
डैनियल बेक

डैनियल के लिए ऋण, मैं इस से के लिए उधार ली गई एक जवाब एक प्रश्न के में अलग से पूछते हैं, कर सकते खोजक और "खुला" आदेश का इलाज .sh या अन्य विशिष्ट एक्सटेंशन बस .command फ़ाइलों की तरह साथ फ़ाइलें?
ग्राहम पेरिन

अगर वहाँ है यूटीआई के लिए एक वैकल्पिक प्रविष्टि मौजूद है, तो आप सहमत होंगे कि "एक सरणी से एक भी शब्दकोश से कमांड लाइन हटाने अनावश्यक रूप से कठिन हो सकता है"?
ग्राहम पेरिन

1
@GrahamPerrin यह अनावश्यक रूप से मुश्किल है क्योंकि defaultsऐसा करने में सक्षम नहीं लगता है, और इसके लिए कुछ PlistBuddyकॉल की आवश्यकता होती है । लेकिन इसे पुन: प्रयोज्य शैल लिपि में करना संभव है।
डैनियल बेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.