在 Mac OS X 中如何找出文件属于哪个包?

在 Mac OS X 中如何找出文件属于哪个包?

有没有办法找出哪个应用程序/包拥有或创建了特定文件?例如,在 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/binGit OS X 安装程序或/usr/X11/binX11。

  • 一些系统框架符号链接到/usr/bin,例如rake指向/System/Library/Frameworks/Ruby.framework

  • 任何应用程序都不应使用/bin/sbin。任何第三方应用程序(即任何非 OS X 框架的应用程序)都不应使用/usr/bin其中任何一个。

答案3

要将它们收集到 OSX 上其他两个包管理器的一个位置:

为了麦金塔(正如 Neil 在上面的评论中提到的):

port provides /opt/local/bin/progname

为了酿造它不是那么简单,但通常可以使用以下方法找到该包:

ls -la /usr/local/bin/progname

其中应该显示包含包名称的软链接,否则可以使用其他建议这些问题

相关内容