Wie finde ich heraus, welche Datei zu welchem ​​Paket in Mac OS X gehört?

8

Gibt es eine Möglichkeit herauszufinden, welche Anwendung / welches Paket eine bestimmte Datei besitzt oder erstellt? Unter Linux zeigen diese Befehle beispielsweise den Paketbesitzer an

apt-file /bin/progname

rpm -qf /bin/progname

yum whatprovides /bin/progname

In OS X kann eine Datei Teil einer nativen OS X-Anwendung sein oder von Macports oder Homebrew installiert werden. Dies sind völlig unterschiedliche Umgebungen. Gibt es Befehle für jede Umgebung, um zu überprüfen, welche Anwendung / welches Paket eine bestimmte Datei besitzt?

Hanxue
quelle

Antworten:

19

Es ist etwas spät, aber vielleicht hilft es anderen.

Sie können den pkgutilBefehl verwenden.

Wenn Sie beispielsweise wissen möchten, zu welchem ​​Paket der Befehl "less" ausgeführt werden soll:

pkgutil --file-info /usr/bin/less

Welches wird so etwas ausgeben wie:

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.BaseSystemBinariesFühren Sie in unserem Beispiel Folgendes aus, um alle in einem Paket enthaltenen Dateien aufzulisten :

pkgutil --files com.apple.pkg.BaseSystemBinaries

Ich weiß, dass dieses Tool seit OS X 10.6 vorhanden ist.

Bhavin
quelle
Dies sollte als die richtige Antwort markiert werden. Sie können es sogar mit GUI-Anwendungen verwenden. Versuchen Sie es pkgutil --file-info /Applications/TextEdit.app, und Sie werden feststellen, dass es zu com.apple.pkg.Essentials gehört, aber Sie erfahren auch, welche Updater darauf angewendet wurden (in meinem Fall 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
5

Dies ist nicht wirklich möglich, da es kein standardisiertes Paketmanagement gibt.

Sofern Sie MacPorts oder Homebrew nicht anders konfiguriert haben, finden Sie ihre ausführbaren Dateien immer an einem Ort, den niemand anderes verwendet. Da MacPorts und Homebrew nicht unter einem separaten Benutzerkonto ausgeführt werden, gehören die von ihnen erstellten Dateien immer Ihrem Benutzer oder root.

Was bleibt, ist, dass Sie nur versuchen können, basierend auf dem ausführbaren Speicherort zu raten. Hier sind einige Regeln:

  • MacPorts verwendet /opt/local/binund /opt/local/sbinfür ausführbare Dateien alles unter /opt/local.

  • Homebrew verwendet /usr/local/binfür ausführbare Dateien alles andere unter /usr/local/.

  • Andere Anwendungen sollten irgendwo darunter ihre eigenen Verzeichnisse erstellen /usr, z. B. /usr/local/git/binfür das Git OS X-Installationsprogramm oder /usr/X11/binfür X11.

  • Einige System-Frameworks verknüpfen mit /usr/bin, z. B. rakeverweist auf/System/Library/Frameworks/Ruby.framework

  • Keine Anwendung sollte jemals /binoder verwenden /sbin. Es sollte auch keine Drittanbieteranwendung (dh nichts anderes als ein OS X-Framework) verwendet /usr/binwerden.

slhck
quelle
Es ist nicht wahr, dass es kein standardisiertes Paketmanagement gibt. Mac OS X installiert fast die gesamte Software aus Paketen (mithilfe des Installationsprogramms) und führt eine Aufzeichnung. Siehe Antwort von @bhavin.
Neil Mayhew
1
Du hast recht. Ich habe mehr über Programme gesprochen, die möglicherweise keine Standardpakete verwenden. Ich wusste nicht viel über pkgutil, als ich diese Antwort schrieb.
Slhck
Ich wusste es auch nicht pkgutilund es klingt ziemlich praktisch.
Neil Mayhew
Mit MacPorts, können Sie herausfinden, welcher Port besitzt eine bestimmte Datei mitport provides FILE
Neil Mayhew
2

So sammeln Sie sie an einem Ort für die beiden anderen Paketmanager unter OSX:

Für MacPorts (wie von Neil in den obigen Kommentaren erwähnt):

port provides /opt/local/bin/progname

Für Brew ist es nicht so einfach, aber man kann das Paket normalerweise finden mit:

ls -la /usr/local/bin/progname

Welches sollte einen Softlink anzeigen, der den Paketnamen enthält, oder man kann andere Vorschläge aus einer dieser Fragen verwenden .

Pierz
quelle