有没有更快的方法来更改与OS X上的文件类型关联的默认应用程序?


13

除了使用RCDefaultAppMagic Launch还是重复按Finder信息面板中的全部更改按钮,还有什么更方便的选择?

我考虑过编写一个外壳脚本,该脚本将修改Info.plist文件中的CFBundleDocumentTypes数组。但是每个应用程序都有多个需要更改的键(有时是图标)。

lsregister 不能用于对Launch Services数据库进行特定的修改。

$ `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

劳里(Lauri)的工作真棒,网络上充斥着人们建议使用Cmd-i,“全部更改”。duti下次尝试另一个可重新注册数十种文件类型的应用程序时,我会旋转一下。
ocodo 2012年

Answers:


12

杜蒂

  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

查找捆绑包标识符或UTI:

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

在发现之前,我写了一个非常像duti的Ruby脚本。它需要重新启动操作系统以应用更改。它还会覆盖对的所有外部更改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 ......在某些情况下,操作系统的重启不会需要进行以下使用duti的。
格雷厄姆·佩林

2
@GrahamPerrin我的意思是我自己的Ruby脚本(不是duti)需要重新启动。实际上,我之所以切换到duti主要是因为它不需要重新启动或覆盖plist。
Lri 2012年

1

您可以轻松地更改哪种应用程序打开所有AVI,而无需编写脚本。查找一个AVI文件,并获取有关它的信息。这将显示文件信息。选择要打开文件的程序,然后单击“全部更改...”按钮。这将提示您更改默认关联。 在此处输入图片说明

只是一点,资源分叉并没有被淘汰,但是创建者代码已经被淘汰。因此,较新的Mac OS系统具有更灵活的系统来确定如何打开文件。应用程序应该可以在没有资源派生的文件上工作,但是某些应用程序仍在使用它们。


1
从信息对话框更改默认应用程序大约需要10次鼠标或键盘操作。在最初的几百次左右之后,这变得非常烦人。
Lri 2011年

在这种情况下,请在网站上的其他位置查看此答案,它将向您展示如何进行命令行批处理更改。
mauvedeity

(链接的答案是关于从其资源分支更改单个文件的默认应用程序。)即使我修改了所有现有文件的资源分支,它也不会更改我将在其中拥有的文件的默认应用程序。未来。
Lri
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.