題 如何找到一個文件屬於Mac OS X中的哪個軟件包?


有沒有辦法找出哪個應用程序/包擁有或創建一個特定的文件?例如,在Linux中,這些命令將顯示包所有者

apt-file /bin/progname

rpm -qf /bin/progname

yum whatprovides /bin/progname

在OS X中,文件可以是本機OS X應用程序的一部分,也可以由Macports或Homebrew安裝。這些是完全不同的環境。是否有每個環境的命令來檢查哪個應用程序/包擁有特定文件?


7
2017-09-25 09:45


起源




答案:


這有點晚了,但也許對其他人有幫助。

你可以使用 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以來這個工具已經存在。


17
2018-03-20 01:39



這應該被標記為正確的答案。您甚至可以將它與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)。 - juandesant


這是不可能的,因為沒有標準化的包管理。

除非您以不同方式配置MacPorts或Homebrew,否則您將始終在其他人無法使用的位置找到它們的可執行文件。由於MacPorts和Homebrew不在單獨的用戶帳戶下運行,因此他們創建的文件將始終由您的用戶擁有或 root

剩下的是你只能根據可執行位置進行猜測。以下是一些規則:

  • MacPorts使用 /opt/local/bin 和 /opt/local/sbin 對於可執行文件,所有內容都以前綴為前綴 /opt/local

  • 自製軟件使用 /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 無論是。


4
2017-09-25 10:41



沒有標準化的包管理,這是不正確的。 Mac OS X幾乎安裝了所有軟件包(使用安裝程序)和keepsa記錄。見@bhavin的回答。 - Neil Mayhew
你是對的。我更多地談論可能不使用標準包的程序。當我寫這個答案時,對pkgutil不太了解。 - slhck
我不知道 pkgutil 要么,這聽起來很方便。 - Neil Mayhew
使用MacPorts,您可以找出使用哪個端口擁有特定文件 port provides FILE - Neil Mayhew


要在OSX上為其他兩個包管理器在一個地方收集它們:

對於 MacPorts的 (如Neil在上述評論中所述):

port provides /opt/local/bin/progname

對於 釀造 它不是那麼簡單但通常可以找到包使用:

ls -la /usr/local/bin/progname

哪個應該顯示包含包名稱的軟鏈接,否則可以使用其他建議  這些 問題


0
2018-01-05 13:16