क्या ओएस एक्स पर फ़ाइल प्रकारों से जुड़े डिफ़ॉल्ट ऐप्स को बदलने का एक तेज़ तरीका है?


13

क्या RCDefaultApp या मैजिक लॉन्च का उपयोग करने से ज्यादा सुविधाजनक कुछ है , या सिर्फ बार-बार फाइंडर के सूचना पटल के सभी बटन को दबाएं ?

मैंने एक शेल स्क्रिप्ट लिखने के बारे में सोचा था जो Info.plist फ़ाइलों में CFBundleDocumentTypes सरणियों को संशोधित करेगा। लेकिन प्रत्येक ऐप में कई कुंजियाँ (कभी-कभी एक आइकन) होती हैं जिन्हें बदलना होगा।

lsregister लॉन्च सेवा डेटाबेस में विशिष्ट संशोधन करने के लिए इस्तेमाल नहीं किया जा सकता है।

$ `locate lsregister` -h
lsregister: [OPTIONS] [ <path>... ]
                      [ -apps <domain>[,domain]... ]
                      [ -libs <domain>[,domain]... ]
                      [ -all  <domain>[,domain]... ]

Paths are searched for applications to register with the Launch Service database.
Valid domains are "system", "local", "network" and "user". Domains can also
be specified using only the first letter.

  -kill     Reset the Launch Services database before doing anything else
  -seed     If database isn't seeded, scan default locations for applications and libraries to register
  -lint     Print information about plist errors while registering bundles
  -convert  Register apps found in older LS database files
  -lazy n   Sleep for n seconds before registering/scanning
  -r        Recursive directory scan, do not recurse into packages or invisible directories
  -R        Recursive directory scan, descending into packages and invisible directories
  -f        force-update registration even if mod date is unchanged
  -u        unregister instead of register
  -v        Display progress information
  -dump     Display full database contents after registration
  -h        Display this help

बहुत बढ़िया काम लॉरी, Cmd-i, चेंज ऑल का सुझाव देने वाले लोगों के साथ नेट की धूम है। मैं dutiअगली बार एक चक्कर दूंगा, मैं एक और ऐप आज़माता हूं जो दर्जनों फ़ाइल प्रकारों को फिर से पंजीकृत करता है।
ओकुदो

जवाबों:


12

Duti

  1. Pkg इंस्टॉलर डाउनलोड करें या स्रोत से संकलित करें
  2. एक फाइल को इस तरह सेव करें:

    com.macromates.textmate public.shell-script all
    com.macromates.textmate public.unix-executable all
    com.macromates.textmate com.apple.property-list all
    org.videolan.vlc .avi all
    org.videolan.vlc .mkv all
    # ...
    
  3. duti $file.duti

बंडल पहचानकर्ता या यूटीआई ढूँढना:

bundleid() {
  osascript -e "id of app \"$*\""
}

getuti() {
  local f="/tmp/me.lri.getuti.${1##*.}"
  touch "$f"
  mdimport "$f"
  mdls -name kMDItemContentTypeTree "$f"
  rm "$f"
}

lsapps

इससे पहले कि मुझे इसके बारे में पता चले, मैंने रूबी स्क्रिप्ट को डूटी की तरह लिखा। हालाँकि परिवर्तनों को लागू करने के लिए OS को पुनः आरंभ करना आवश्यक है। यह किसी भी बाहरी परिवर्तन को भी अधिलेखित करता है com.apple.LaunchServices.plist

#!/usr/bin/env ruby

datafile = "#{ENV['HOME']}/Notes/lsapps.txt"
cachedir = "#{ENV['HOME']}/Library/Caches/me.lri.scripts"
cachefile = cachedir + "/lsapps"
`mkdir -p #{cachedir}; touch #{cachefile}`
cachetext = IO.read(cachefile)

a = []
IO.readlines(datafile).each do |line|
  line.strip!
  next unless line =~ /^([^#].*): (.+)/
  z = $1, $2

  bid = cachetext.scan(/#{z[0]}  (.*)/)[0]
  unless bid
    bid = `osascript -e 'id of app "#{z[0]}"'`.chomp
    next unless bid
    File.open(cachefile, "a") { |f| f.puts(z[0] + "  " + bid) }
  end

  z[1].strip.split(" ").each do |e|
    if e =~ /(.+):\/\/$/
      a << "{LSHandlerURLScheme='#{$1}';LSHandlerRoleAll='#{bid}';}"
    elsif e.include?(".")
      a << "{LSHandlerContentType='#{e}';LSHandlerRoleAll='#{bid}';}"
    else
      a << "{LSHandlerContentTag='#{e}';LSHandlerContentTagClass=\
'public.filename-extension';LSHandlerRoleAll='#{bid}';}"
    end
  end
end

system("defaults", "write", "com.apple.LaunchServices", "LSHandlers",
"(" + a.join(",") + ")")

`defaults write com.apple.LaunchServices LSQuarantine -bool false`

lsapps.txt

NetNewsWire Lite: feed:// public.rss
iCal: icaltodo icalevent
Google Chrome: chrome://
Safari: public.html
TextEdit: txt text md markdown csv
TextMate: public.shell-script public.unix-executable public.script ssh:// xml plist dict css rst tex sh pl py rb gemspec php js java c h m conf bash opml as cfm cfml class coffee ctp erb rhtml haml less msass scss yaml rd
VLC: avi mpg flv mkv mp4 flac 3gp
The Unarchiver: rar
Skim: pdf
iChm: chm
AppleScript Editor: scpt
Sequential: png jpg


@Kopischke द्वारा टिप्पणी की गई ... कुछ मामलों में, डॉटी के उपयोग के बाद ऑपरेटिंग सिस्टम के पुनरारंभ की आवश्यकता नहीं है।
ग्राहम पेरिन

2
@GrahamPerrin मेरा मतलब था कि मेरी अपनी रूबी स्क्रिप्ट (डूटी नहीं) को पुनः आरंभ करने की आवश्यकता है। मैंने वास्तव में मुख्य रूप से डूटी पर स्विच किया क्योंकि इसमें प्लास्ट को फिर से शुरू करने या ओवरराइट करने की आवश्यकता नहीं है।
Lri

1

आप बदल सकते हैं कि क्या एप्लिकेशन सभी एवीआई को आसानी से खोलता है, कोई स्क्रिप्टिंग की आवश्यकता नहीं है। एक AVI फ़ाइल ढूँढें, और उस पर जानकारी प्राप्त करें। यह आपको फ़ाइल जानकारी दिखाएगा। फ़ाइलों को खोलना चाहते हैं उस प्रोग्राम का चयन करें, फिर "सभी बदलें ..." बटन पर क्लिक करें। यह आपको डिफ़ॉल्ट एसोसिएशन को बदलने के लिए संकेत देगा। यहाँ छवि विवरण दर्ज करें

बस एक छोटे बिंदु के रूप में, संसाधन कांटे को चरणबद्ध नहीं किया जा रहा है, लेकिन निर्माता कोड हैं। जैसे, नए मैक ओएस सिस्टम में फाइलों को खोलने के तरीके के लिए एक अधिक लचीला प्रणाली है। एप्लिकेशन उन फ़ाइलों पर काम करने वाले हैं जिनके पास संसाधन कांटे नहीं हैं, लेकिन कुछ एप्लिकेशन अभी भी उनका उपयोग करते हैं।


1
डिफॉल्ट ऐप को सूचना डायलॉग से बदलने के लिए लगभग 10 माउस या कीबोर्ड एक्शन की आवश्यकता होती है। यह पहले कुछ सौ बार या उसके बाद बहुत कष्टप्रद हो जाता है।
23

उस स्थिति में, इस उत्तर को साइट पर कहीं और देखें , यह आपको दिखाएगा कि कमांड लाइन बैच परिवर्तन कैसे करें।
8:11

(लिंक किया गया उत्तर इसके संसाधन फोर्क से किसी एकल फ़ाइल के डिफ़ॉल्ट ऐप को बदलने के बारे में है।) भले ही मैंने अपनी सभी मौजूदा फ़ाइलों के संसाधन फ़ॉर्क्स को संशोधित किया हो, यह उन फ़ाइलों के डिफ़ॉल्ट ऐप्स को नहीं बदलेगा, जो मेरे पास होंगे भविष्य।
लारी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.