¿Cómo descubrir que un archivo pertenece a qué paquete en Mac OS X?

8

¿Hay alguna manera de averiguar qué aplicación / paquete posee o crea un archivo específico? Por ejemplo, en Linux estos comandos mostrarán al propietario del paquete

apt-file /bin/progname

rpm -qf /bin/progname

yum whatprovides /bin/progname

En OS X, un archivo podría ser parte de una aplicación nativa de OS X, o instalado por Macports o Homebrew. Estos son ambientes completamente diferentes. ¿Hay comandos para cada entorno para verificar qué aplicación / paquete posee un archivo específico?

hanxue
fuente

Respuestas:

19

Es un poco tarde, pero tal vez sea de ayuda para otros.

Puedes usar el pkgutilcomando.

Por ejemplo, si desea saber a qué paquete pertenece el comando "menos" para ejecutar:

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

Lo que generará algo como:

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

Para enumerar todos los archivos contenidos en un paquete, com.apple.pkg.BaseSystemBinariesen nuestro ejemplo, ejecute:

pkgutil --files com.apple.pkg.BaseSystemBinaries

Sé que esta herramienta ha estado presente desde OS X 10.6.

Bhavin
fuente
Esto debe ser marcado como la respuesta correcta. Incluso puede usarlo con aplicaciones GUI. Inténtalo pkgutil --file-info /Applications/TextEdit.appy verás que pertenece a com.apple.pkg.Essentials, pero también te dirá qué actualizaciones se le han aplicado (en mi caso, 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

Esto no es realmente posible ya que no hay una gestión de paquetes estandarizada.

A menos que haya configurado MacPorts o Homebrew de manera diferente, siempre encontrará sus ejecutables en una ubicación que nadie más usa. Dado que MacPorts y Homebrew no se ejecutan en una cuenta de usuario separada, los archivos que crean siempre serán propiedad de su usuario o root.

Lo que queda es que solo puedes intentar adivinar en función de la ubicación ejecutable. Aquí hay algunas reglas:

  • MacPorts usa /opt/local/biny /opt/local/sbinpara ejecutables, todo con el prefijo /opt/local.

  • Homebrew utiliza /usr/local/binpara ejecutables, todo lo demás debajo /usr/local/.

  • Otras aplicaciones deberían crear sus propios directorios en algún lugar /usr, por ejemplo, /usr/local/git/binpara el instalador de Git OS X o /usr/X11/binpara X11.

  • Algunos enlaces del marco de sistema a /usr/bin, por ejemplo, rakeapunta a/System/Library/Frameworks/Ruby.framework

  • Ninguna aplicación debería usar /bino /sbin. Ninguna aplicación de terceros (es decir, algo que no sea un marco OS X) debería usar /usr/bintampoco.

slhck
fuente
No es cierto que no haya una gestión de paquetes estandarizada. Mac OS X instala casi todo el software de los paquetes (usando el instalador) y mantiene un registro. Ver respuesta de @bhavin.
Neil Mayhew
1
Tienes razón. Estaba hablando más sobre los programas que podrían no usar paquetes estándar. No sabía mucho sobre pkgutil cuando escribí esta respuesta.
slhck
Yo tampoco lo sabía pkgutil, y suena bastante útil.
Neil Mayhew
Con MacPorts, puede averiguar qué puerto posee un archivo en particular utilizandoport provides FILE
Neil Mayhew
2

Para recopilarlos en un lugar para los otros dos administradores de paquetes en OSX:

Para MacPorts (como lo menciona Neil en los comentarios anteriores):

port provides /opt/local/bin/progname

Para Brew no es tan simple, pero generalmente se puede encontrar el paquete usando:

ls -la /usr/local/bin/progname

Que debería mostrar un enlace suave que contiene el nombre del paquete, o de lo contrario uno puede usar otras sugerencias de una de estas preguntas .

Pierz
fuente