有没有办法找出哪个应用程序/包拥有或创建了特定文件?例如,在 Linux 中,这些命令将显示包所有者
apt-file /bin/progname
rpm -qf /bin/progname
yum whatprovides /bin/progname
在 OS X 中,文件可能是 OS X 原生应用程序的一部分,也可能是由 Macports 或 Homebrew 安装的。这些是完全不同的环境。每个环境是否有命令来检查哪个应用程序/包拥有特定文件?
答案1
虽然有点晚了,但也许对其他人有帮助。
您可以使用该pkgutil
命令。
例如,如果您想知道“less”命令属于哪个包,请运行:
pkgutil --file-info /usr/bin/less
输出内容如下:
volume: /
path: /usr/bin/less
pkgid: com.apple.pkg.BaseSystemBinaries
pkg-version: 10.7.0.1.1.1309742044
install-time: 1310407891
uid: 0
gid: 0
mode: 755
要列出包中包含的所有文件,com.apple.pkg.BaseSystemBinaries
在我们的示例中,运行:
pkgutil --files com.apple.pkg.BaseSystemBinaries
我知道这个工具从 OS X 10.6 开始就已经存在了。
答案2
由于没有标准化的包管理,这实际上是不可能的。
除非您对 MacPorts 或 Homebrew 进行了不同的配置,否则您总会在别人未使用的位置找到它们的可执行文件。由于 MacPorts 和 Homebrew 不在单独的用户帐户下运行,因此它们创建的文件将始终归您的用户或所有root
。
剩下的就是你只能根据可执行文件的位置进行猜测。以下是一些规则:
MacPorts 使用
/opt/local/bin
和/opt/local/sbin
作为可执行文件,所有内容都以 为前缀/opt/local
。Homebrew 用于
/usr/local/bin
可执行文件,其他一切都在 下/usr/local/
。其他应用程序应该在下的某个地方创建自己的目录
/usr
,例如/usr/local/git/bin
Git OS X 安装程序或/usr/X11/bin
X11。一些系统框架符号链接到
/usr/bin
,例如rake
指向/System/Library/Frameworks/Ruby.framework
任何应用程序都不应使用
/bin
或/sbin
。任何第三方应用程序(即任何非 OS X 框架的应用程序)都不应使用/usr/bin
其中任何一个。