मैं ओएस एक्स में टर्मिनल के माध्यम से किसी विशेष फ़ाइल प्रकार की सभी फ़ाइलों के लिए डिफ़ॉल्ट ऐप कैसे बदल सकता हूं?
मैं ओएस एक्स में टर्मिनल के माध्यम से किसी विशेष फ़ाइल प्रकार की सभी फ़ाइलों के लिए डिफ़ॉल्ट ऐप कैसे बदल सकता हूं?
जवाबों:
मेरे पास एक सरल तरीका है। यदि आप पहले से ही यह नहीं चाहते हैं तो आप Homebrew चाहते हैं :
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install duti
अब आपको उस ऐप की आईडी ढूंढनी होगी जिसका आप उपयोग करना चाहते हैं, और इसे उस एक्सटेंशन पर असाइन करें जिसे आप इसके लिए उपयोग करना चाहते हैं। इस उदाहरण में, मैं पहले से ही ब्रैकेट का उपयोग करता *.sh
हूं और मैं इसे *.md
xcode के बजाय फ़ाइलों के लिए भी उपयोग करना चाहता हूं ।
.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
osascript -e 'id of app "$appName"'
अपने सिस्टम पर इंस्टॉल किए गए किसी भी ऐप की आईडी प्राप्त करने के लिए कर सकते हैं
duti -s $(osascript -e 'id of app "Visual Studio Code"') .md all
संपादित करें ~/Library/Preferences/com.apple.LaunchServices.plist
।
LSHandlers
UTI (कुंजी 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
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"))'
।
defaults
ऐसा करने में सक्षम नहीं लगता है, और इसके लिए कुछ PlistBuddy
कॉल की आवश्यकता होती है । लेकिन इसे पुन: प्रयोज्य शैल लिपि में करना संभव है।