Как узнать, к какому пакету принадлежит Mac OS X?

8

Есть ли способ узнать, какое приложение / пакет владеет или создает определенный файл? Например, в Linux эти команды покажут владельца пакета

apt-file /bin/progname

rpm -qf /bin/progname

yum whatprovides /bin/progname

В OS X файл может быть частью собственного приложения OS X или установлен Macports или Homebrew. Это совершенно разные среды. Существуют ли команды для каждой среды, чтобы проверить, какому приложению / пакету принадлежит определенный файл?

hanxue
источник

Ответы:

19

Уже немного поздно, но, возможно, это поможет другим.

Вы можете использовать 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.

Bhavin
источник
Это должно быть помечено как правильный ответ. Вы даже можете использовать его с приложениями с графическим интерфейсом. Попробуйте 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).
'13
5

На самом деле это невозможно, поскольку нет стандартизированного управления пакетами.

Если вы не настроили 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.

slhck
источник
Это не правда, что нет стандартизированного управления пакетами. Mac OS X устанавливает практически все программное обеспечение из пакетов (используя Установщик) и ведет запись. Смотрите ответ от @bhavin.
Нейл Мэйхью
1
Вы правы. Я больше говорил о программах, которые могут не использовать стандартные пакеты. Не очень много знал о pkgutil, когда писал этот ответ.
slhck
Я не знал pkgutilни об этом , и это звучит довольно удобно.
Нейл Мэйхью
С помощью MacPorts вы можете узнать, какому порту принадлежит определенный файл,port provides FILE
Нейл Мэйхью
2

Чтобы собрать их в одном месте для двух других менеджеров пакетов в OSX:

Для MacPorts (как упомянуто Нейлом в комментариях выше):

port provides /opt/local/bin/progname

Для Brew это не так просто, но обычно можно найти пакет, используя:

ls -la /usr/local/bin/progname

Который должен показывать программную ссылку, содержащую имя пакета, иначе можно воспользоваться другими предложениями из одного из этих вопросов .

Пирз
источник