Jak znaleźć plik, który należy do którego pakietu w Mac OS X?

8

Czy istnieje sposób, aby dowiedzieć się, która aplikacja / pakiet jest właścicielem lub tworzy określony plik? Na przykład w systemie Linux polecenia te pokażą właściciela pakietu

apt-file /bin/progname

rpm -qf /bin/progname

yum whatprovides /bin/progname

W OS X plik może być częścią natywnej aplikacji OS X lub być zainstalowany przez Macports lub Homebrew. Są to zupełnie inne środowiska. Czy istnieją polecenia dla każdego środowiska, aby sprawdzić, która aplikacja / pakiet jest właścicielem określonego pliku?

Hanxue
źródło

Odpowiedzi:

19

Jest trochę późno, ale być może będzie to pomocne dla innych.

Możesz użyć pkgutilpolecenia.

Na przykład, jeśli chcesz wiedzieć, do którego pakietu należy uruchomić polecenie „mniej”:

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

Co da wynik:

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

Aby wyświetlić listę wszystkich plików zawartych w pakiecie, com.apple.pkg.BaseSystemBinariesw naszym przykładzie uruchom:

pkgutil --files com.apple.pkg.BaseSystemBinaries

Wiem, że to narzędzie jest obecne od OS X 10.6.

bhavin
źródło
Należy to zaznaczyć jako właściwą odpowiedź. Możesz go nawet używać z aplikacjami GUI. Spróbuj pkgutil --file-info /Applications/TextEdit.app, a dostaniesz, że należy do com.apple.pkg.Essentials, ale również powie ci, które aktualizacje zostały zastosowane do niego (w moim przypadku 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

Nie jest to tak naprawdę możliwe, ponieważ nie ma standardowego zarządzania pakietami.

O ile MacPorts lub Homebrew nie skonfigurujesz inaczej, zawsze znajdziesz ich pliki wykonywalne w miejscu, którego nikt inny nie używa. Ponieważ MacPorts i Homebrew nie działają na osobnym koncie użytkownika, tworzone przez nich pliki zawsze będą własnością użytkownika lub użytkownika root.

Pozostaje tylko to, że możesz zgadywać tylko na podstawie lokalizacji wykonywalnej. Oto kilka zasad:

  • MacPorts używa, /opt/local/bina /opt/local/sbindla plików wykonywalnych - wszystko z prefiksem /opt/local.

  • Homebrew używa /usr/local/binplików wykonywalnych, wszystko inne poniżej /usr/local/.

  • Inne aplikacje powinny gdzieś tworzyć własne katalogi /usr, np. /usr/local/git/binDla instalatora Git OS X lub /usr/X11/binX11.

  • Niektóre frameworki systemowe symbolicznie wskazują na /usr/binnprake/System/Library/Frameworks/Ruby.framework

  • Żadna aplikacja nigdy nie powinna używać /binlub /sbin. Żadna aplikacja innej firmy (tj. Nic innego niż system OS X) nie powinna również używać /usr/bin.

slhck
źródło
To nieprawda, że ​​nie ma standardowego zarządzania pakietami. Mac OS X instaluje prawie całe oprogramowanie z pakietów (za pomocą Instalatora) i prowadzi rejestr. Zobacz odpowiedź od @bhavin.
Neil Mayhew
1
Masz rację. Mówiłem raczej o programach, które mogą nie używać standardowych pakietów. Nie wiedziałem wiele o pkgutil, kiedy napisałem tę odpowiedź.
slhck
Nie wiedziałem też o tym pkgutili brzmi to całkiem przydatne.
Neil Mayhew
Dzięki MacPorts możesz dowiedzieć się, który port jest właścicielem określonego pliku, używającport provides FILE
Neil Mayhew
2

Aby zebrać je w jednym miejscu dla dwóch innych menedżerów pakietów w OSX:

W przypadku MacPorts (jak wspomniał Neil w komentarzach powyżej):

port provides /opt/local/bin/progname

W przypadku Brew nie jest to takie proste, ale zwykle można znaleźć pakiet za pomocą:

ls -la /usr/local/bin/progname

Który powinien pokazywać softlink zawierający nazwę pakietu, w przeciwnym razie można użyć innych sugestii z jednego z tych pytań .

Pierz
źródło