Como descobrir que um arquivo pertence a qual pacote no Mac OS X?

8

Existe uma maneira de descobrir qual aplicativo / pacote possui ou cria um arquivo específico? Por exemplo, no Linux, esses comandos mostram o proprietário do pacote

apt-file /bin/progname

rpm -qf /bin/progname

yum whatprovides /bin/progname

No OS X, um arquivo pode fazer parte de um aplicativo OS X nativo ou instalado por Macports ou Homebrew. Estes são ambientes completamente diferentes. Existem comandos para cada ambiente para verificar qual aplicativo / pacote possui um arquivo específico?

hanxue
fonte

Respostas:

19

É um pouco tarde, mas talvez ajude os outros.

Você pode usar o pkgutilcomando

Por exemplo, se você deseja saber qual pacote o comando "less" pertence à execução:

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

O que produzirá 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 listar todos os arquivos contidos em um pacote, com.apple.pkg.BaseSystemBinariesem nosso exemplo, execute:

pkgutil --files com.apple.pkg.BaseSystemBinaries

Eu sei que essa ferramenta está presente desde o OS X 10.6.

bhavin
fonte
Isso deve ser marcado como a resposta certa. Você pode até usá-lo com aplicativos GUI. Tente pkgutil --file-info /Applications/TextEdit.appe você verá que ele pertence a com.apple.pkg.Essentials, mas também informará quais atualizadores foram aplicados a ele (no meu 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).
precisa saber é
5

Isso não é realmente possível, pois não há gerenciamento de pacotes padronizado.

A menos que você tenha configurado o MacPorts ou o Homebrew de maneira diferente, sempre encontrará os executáveis ​​em um local que ninguém mais usa. Como o MacPorts e o Homebrew não são executados em uma conta de usuário separada, os arquivos que eles criam sempre pertencem ao seu usuário ou root.

O que resta é que você só pode tentar adivinhar com base no local do executável. Aqui estão algumas regras:

  • MacPorts usa /opt/local/bine /opt/local/sbinpara executáveis, tudo prefixado em /opt/local.

  • O Homebrew usa /usr/local/binpara executáveis, tudo o resto /usr/local/.

  • Outros aplicativos devem criar seus próprios diretórios em algum lugar abaixo /usr, por exemplo, /usr/local/git/binpara o instalador do Git OS X ou /usr/X11/binpara o X11.

  • Algumas estruturas de sistema fazem um link simbólico para /usr/bin, por exemplo, rakeapontam para/System/Library/Frameworks/Ruby.framework

  • Nenhum aplicativo deve usar /binou /sbin. Nenhum aplicativo de terceiros (ou seja, qualquer coisa que não seja uma estrutura do OS X) também deve usar /usr/bin.

slhck
fonte
Não é verdade que não há gerenciamento de pacotes padronizado. O Mac OS X instala quase todos os softwares dos pacotes (usando o Instalador) e mantém um registro. Veja a resposta de @bhavin.
Neil Mayhew
11
Você está certo. Eu estava falando mais sobre os programas que podem não usar pacotes padrão. Não sabia muito sobre o pkgutil quando escrevi esta resposta.
slhck
Eu também não sabia pkgutil, e isso parece bastante útil.
Neil Mayhew
Com MacPorts, você pode descobrir qual porta possui um determinado arquivo usandoport provides FILE
Neil Mayhew
2

Para coletá-los em um local para os outros dois gerenciadores de pacotes no OSX:

Para MacPorts (como mencionado por Neil nos comentários acima):

port provides /opt/local/bin/progname

Para o Brew , não é tão simples, mas geralmente é possível encontrar o pacote usando:

ls -la /usr/local/bin/progname

O qual deve mostrar um softlink que contém o nome do pacote; caso contrário, pode-se usar outras sugestões de uma dessas perguntas .

Pierz
fonte