Làm cách nào để tìm ra một tệp thuộc về gói nào trong Mac OS X?


8

Có cách nào để tìm ra Ứng dụng / gói nào sở hữu hoặc tạo một tệp cụ thể không? Ví dụ: trong Linux, các lệnh này sẽ hiển thị chủ sở hữu gói

apt-file /bin/progname

rpm -qf /bin/progname

yum whatprovides /bin/progname

Trong OS X, một tệp có thể là một phần của ứng dụng OS X gốc hoặc được cài đặt bởi Macports hoặc Homebrew. Đây là những môi trường hoàn toàn khác nhau. Có các lệnh cho từng môi trường để kiểm tra ứng dụng / gói nào sở hữu một tệp cụ thể không?

Câu trả lời:


19

Hơi muộn một chút, nhưng có lẽ nó sẽ giúp ích cho người khác.

Bạn có thể sử dụng pkgutillệnh.

Ví dụ: nếu bạn muốn biết lệnh "less" thuộc về gói nào:

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

Mà sẽ xuất ra một cái gì đó như:

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

Để liệt kê tất cả các tệp có trong một gói, com.apple.pkg.BaseSystemBinariestrong ví dụ của chúng tôi, hãy chạy:

pkgutil --files com.apple.pkg.BaseSystemBinaries

Tôi biết công cụ này đã có mặt từ OS X 10.6.


Điều này nên được đánh dấu là câu trả lời đúng. Bạn thậm chí có thể sử dụng nó với các ứng dụng GUI. Hãy thử pkgutil --file-info /Applications/TextEdit.app, và bạn sẽ nhận ra rằng nó thuộc về com.apple.pkg.Essentials, nhưng cũng sẽ cho bạn biết những cập nhật nào đã được áp dụng cho nó (trong trường hợp của tôi, 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

Điều này là không thực sự có thể vì không có quản lý gói tiêu chuẩn hóa.

Trừ khi bạn định cấu hình MacPorts hoặc Homebrew khác nhau, bạn sẽ luôn tìm thấy các tệp thực thi của chúng ở một vị trí mà không ai khác sử dụng. Vì MacPorts và Homebrew không chạy trong một tài khoản người dùng riêng biệt, các tệp họ tạo sẽ luôn được sở hữu bởi người dùng của bạn hoặc root.

Những gì còn lại là bạn chỉ có thể cố gắng đoán dựa trên vị trí thực thi. Dưới đây là một số quy tắc:

  • MacPorts sử dụng /opt/local/bin/opt/local/sbinđể thực thi, mọi thứ đều có tiền tố /opt/local.

  • Homebrew sử dụng /usr/local/bincho thực thi, mọi thứ khác theo /usr/local/.

  • Các ứng dụng khác sẽ tạo thư mục riêng của chúng ở đâu đó bên dưới /usr, ví dụ: /usr/local/git/bincho trình cài đặt Git OS X hoặc /usr/X11/bincho X11.

  • Một số khung hệ thống symlink tới /usr/bin, ví dụ như raketrỏ đến/System/Library/Frameworks/Ruby.framework

  • Không có ứng dụng nào nên sử dụng /binhoặc /sbin. Không có ứng dụng bên thứ ba nào (tức là mọi thứ không phải là khung OS X) nên sử dụng /usr/bin.


Điều đó không đúng sự thật, không có quản lý gói tiêu chuẩn hóa. Mac OS X cài đặt gần như tất cả các phần mềm từ các gói (sử dụng Trình cài đặt) và bản ghi Keepsa. Xem câu trả lời từ @bhavin.
Neil Mayhew

1
Bạn đúng. Tôi đã nói nhiều hơn về các chương trình có thể không sử dụng các gói tiêu chuẩn. Tôi không biết nhiều về pkgutil khi tôi viết câu trả lời này.
slhck

Tôi cũng không biết pkgutil, và nó có vẻ khá tiện dụng.
Neil Mayhew

Với MacPorts, bạn có thể tìm ra cổng nào sở hữu một tệp cụ thể bằng cách sử dụngport provides FILE
Neil Mayhew

2

Để thu thập chúng ở một nơi cho hai người quản lý gói khác trên OSX:

Đối với MacPorts (như được đề cập bởi Neil trong các bình luận ở trên):

port provides /opt/local/bin/progname

Đối với Brew không đơn giản như vậy nhưng người ta thường có thể tìm thấy gói bằng cách sử dụng:

ls -la /usr/local/bin/progname

Cái nào sẽ hiển thị một liên kết mềm có chứa tên gói, hoặc người khác có thể sử dụng các đề xuất khác từ một trong những câu hỏi này .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.