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

han*_*xue 13 mac macports homebrew macos

有没有办法找出哪个应用程序/包拥有或创建特定文件?例如,在 Linux 中,这些命令将显示包所有者

apt-file /bin/progname

rpm -qf /bin/progname

yum whatprovides /bin/progname
Run Code Online (Sandbox Code Playgroud)

在 OS X 中,文件可以是本地 OS X 应用程序的一部分,或者由 Macports 或 Homebrew 安装。这些是完全不同的环境。是否有针对每个环境的命令来检查哪个应用程序/包拥有特定文件?

小智 21

这有点晚了,但也许对其他人有帮助。

您可以使用该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
Run Code Online (Sandbox Code Playgroud)

要列出包中包含的所有文件,com.apple.pkg.BaseSystemBinaries在我们的示例中,运行:

pkgutil --files com.apple.pkg.BaseSystemBinaries

我知道这个工具从 OS X 10.6 开始就存在了。

  • 这应该被标记为正确答案。您甚至可以将它与 GUI 应用程序一起使用。尝试“pkgutil --file-info /Applications/TextEdit.app”,您会发现它属于 com.apple.pkg.Essentials,但也会告诉您已应用哪些更新程序(在我的情况下, com.apple.pkg.update.os.10.10.2.14C109.patch、com.apple.pkg.update.os.10.10.3.14D131.delta、com.apple.pkg.update.os.10.9.2.13C64.combo )。 (2认同)

slh*_*hck 7

这是不可能的,因为没有标准化的包管理。

除非您以不同方式配置 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/binX11。

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

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

  • 你是对的。我更多地谈论可能不使用标准包的程序。当我写这个答案时,对 pkgutil 了解不多。 (2认同)
  • 使用 MacPorts,您可以使用 `port provides FILE` 找出哪个端口拥有特定文件 (2认同)

Pie*_*erz 5

要在 OSX 上为其他两个包管理器在一个地方收集它们:

对于MacPorts(正如 Neil 在上面的评论中提到的那样):

port provides /opt/local/bin/progname
Run Code Online (Sandbox Code Playgroud)

对于Brew,它不是那么简单,但通常可以使用以下方法找到包:

ls -la /usr/local/bin/progname
Run Code Online (Sandbox Code Playgroud)

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