Câu hỏi Làm cách nào để tìm gói cung cấp tệp?


Câu hỏi đơn giản đủ: là có một số lệnh shell (hoặc phương pháp GUI) tôi có thể sử dụng, cho đường dẫn đến một tập tin trên hệ thống của tôi, cho tôi biết những gì gói đặt nó ở đó? Giả sử các tập tin đã thực sự đến từ một gói, đó là.

Câu hỏi bổ sung: nếu đó là một tệp không được cài đặt trên hệ thống của tôi thì sao? Có, nói, một trang web sẽ cho phép tôi tra cứu một tập tin và xem những gói nào, nếu có, cung cấp cho nó?


382
2017-07-30 08:10


gốc


Tôi luôn tự hỏi bản thân mình - Tôi biết với YUM bạn có thể làm yum whatprovides <filepath> / <filename> nhưng tôi chưa bao giờ thực sự tìm thấy một giải pháp thay thế cho điều đó trong Aptitude ngoài trang web của gói - Marco Ceppi♦
Tương tự trên SU: superuser.com/questions/10997/… - Ciro Santilli 新疆改造中心 六四事件 法轮功
Không có câu trả lời nào ở đây thực sự bao gồm Provides: cơ chế. Trong một số chi tiết hơn, một lệnh như mailx hoặc là sendmail không được bao gồm dưới dạng nhị phân bất kì gói; thay vào đó, các gói khác nhau cài đặt các tệp nhị phân của riêng chúng và sau đó làm cho một số tệp có sẵn dưới tên "chuẩn" qua /etc/alternatives. Xem thêm askubuntu.com/questions/366135/… - tripleee


Các câu trả lời:


Bạn có thể dùng dpkg lệnh để tìm ra gói đã cài đặt nào sở hữu một tệp:

Từ man dpkg:

-S, --search filename-search-pattern ...
                  Tìm kiếm tên tệp từ các gói đã cài đặt.

Thí dụ:

$ dpkg -S /bin/ls
coreutils: /bin/ls

Bạn có thể tìm kiếm bằng một đường dẫn đầy đủ hoặc chỉ với tên tệp.

Nếu bạn muốn tìm kiếm các tệp chưa được cài đặt trên máy tính của mình, bạn có thể sử dụng Tìm kiếm gói Ubuntu


360
2017-07-30 08:42



Tôi khuyên bạn nên sử dụng dlocate, được cập nhật hàng ngày để tra cứu nhanh hơn. - Daniel T Chen
Gợi ý: nếu bạn không biết đường dẫn đầy đủ, nhưng chỉ cần tên lệnh, sử dụng which để tìm chương trình của anh ấy: dpkg -S `which firefox` - Lekensteyn
Điều này cũng làm việc cho các thư viện, đặc biệt tiện dụng nếu bạn có một nhị phân không chạy vì bạn có thể kiểm tra nó bằng ldd và sử dụng các đường dẫn thư viện đầy đủ để tìm các gói bạn đang thiếu. - Alain O'Dea
@DanielTChen, nhưng dlocate có thể không thực hiện công việc, nếu cơ sở dữ liệu của dlocate bị lỗi thời. Bạn phải gọi sudo update-dlocatedb để cập nhật nó. - jarno
Nếu dpkg đường dẫn chính xác không trả lại bất kỳ thứ gì (ví dụ: dpkg /usr/bin/java), hãy thử chỉ tên của tệp thi hành (ví dụ: dpkg java). - Dan Dascalescu


Các apt-file lệnh có thể làm điều này cho bạn từ dòng lệnh. Tôi sử dụng nó thường xuyên khi xây dựng các gói từ nguồn. Đối với các tệp được cung cấp bởi các gói đã được cài đặt trên hệ thống của bạn, apt-cache là một lựa chọn khác.

Để cài đặt apt-file, làm:

sudo apt-get install apt-file

Sau đó, bạn cần phải cập nhật cơ sở dữ liệu của nó:

apt-file update

Và cuối cùng, tìm kiếm tệp:

$ apt-file find kwallet.h
kdelibs5-dev: /usr/include/kwallet.h
libkf5wallet-dev: /usr/include/KF5/KWallet/kwallet.h

Tuy nhiên một cách thân thiện hơn nhiều là sử dụng Tìm kiếm gói Ubuntu trang mạng. Họ có một tùy chọn để "tìm kiếm nội dung của các gói" cho một tên tập tin cụ thể.


187
2017-08-11 02:43



Theo tôi đây là câu trả lời được chấp nhận. Nhưng để đáp lại Tìm kiếm gói Ubuntu, Tôi có thể lập luận rằng một chương trình shell đơn giản này rất thân thiện và dễ nhớ (một khi bạn biết nó). Nếu bạn sử dụng dpkg, apt-get hoặc aptitude làm công cụ chuẩn của mình, sẽ không có gì thân thiện khi kích hoạt Chrome để lướt internet! - user2097818
@ user2097818 Lý do đây không phải là câu trả lời được chấp nhận là câu hỏi chính của tôi bị hạn chế đối với các tệp trên hệ thống và các gói được cài đặt. apt-file thường tìm thấy các mặt tích cực sai, tức là các gói chưa được cài đặt. Tất nhiên câu trả lời này là rất tốt cho "câu hỏi tiền thưởng". - David Z
Đối với những người từ phía Redhat của thế giới - apt-file search <> là tương tự gần nhất với dnf/yum whatprovides <>. - ffledgling


Ngoài ra còn có apt-file để tìm kiếm các tập tin trong các gói không được cài đặt. Ví dụ:

apt-file list packagename

35
2017-07-30 08:49



chính xác những gì tôi đang tìm kiếm. cảm ơn - NES


Bạn có thể tìm kiếm nội dung của các gói có trong các phiên bản Ubuntu khác nhau trên Gói Ubuntu trang mạng. Nhìn dưới tiêu đề "Tìm kiếm nội dung của các gói".

Ví dụ, đây là kết quả tìm kiếm cho libnss3.so trong sáng suốt (10.04):

http://packages.ubuntu.com/search?searchon=contents&keywords=libnss3.so&mode=exactfilename&suite=lucid&arch=any


16
2017-08-11 02:42





Bạn có nghĩa là, mà gói và không ứng dụng nào. Ứng dụng là trình quản lý gói của bạn, ví dụ: Software Center.

Sử dụng dpkg:

dpkg -S /usr/lib/tracker/tracker-store
dpkg -S tracker-extract
dpkg -S tracker-miner-fs

Thí dụ

% dpkg -S /usr/lib/tracker/tracker-store
tracker: /usr/lib/tracker/tracker-store

Sử dụng apt-file:

apt-file search /usr/lib/tracker/tracker-store

hoặc cũng có thể:

apt-file search --regex /tracker-extract$
apt-file search --regex /tracker-miner-fs$

Thí dụ

% apt-file search /usr/lib/tracker/tracker-store
tracker: /usr/lib/tracker/tracker-store

Hoặc trực tuyến đây, trong phần Search the contents of packages.

enter image description here

Thí dụ

enter image description here


10
2017-11-29 15:57



Bạn có nghĩa là, mà gói và không ứng dụng nào. Ứng dụng là trình quản lý gói của bạn, ví dụ: Trung tâm phần mềm. Đuợc. Cảm ơn bạn! :) - ReyKev
Cảm ơn bạn vì tất cả sự giúp đỡ! Không có gợi ý nào trong số những gợi ý này giúp tôi tìm ra gói cài đặt ứng dụng này / những ứng dụng này. Tất cả các tìm kiếm chỉ dẫn trở lại "Tracker". Tôi nghi ngờ đó là Enthoughts 'Canopy mặc dù. EULA dài hàng dặm đã nhắc tôi nhớ về Microsoft Windows cũ của tôi, trong đó, tôi rất vui vì tôi không còn tham gia nữa. Tôi thấy rằng Tracker đã được cài đặt ngày hôm qua vì vậy, như gốc, tôi đã thoát khỏi nó, cùng với Canopy của Enthoughts và, tất cả các vấn đề được giải quyết. Tôi thực sự cảm ơn bạn vì sự giúp đỡ của bạn. Đó là một điều tuyệt vời để có sự hỗ trợ như vậy. Cảm ơn một lần nữa! Kevin - ReyKev


Tôi đã cố gắng theo dõi những gì đã cài đặt which trên hệ thống của tôi. Sau một chút công việc tôi đã tạo ra apt-whatprovides

#!/bin/sh
#apt-whatprovides ver. 201801010101 Copyright alexx, MIT Licence
#rdfa:deps="[realpath,apt-file,grep,which,sh,echo]"

BINARY=$(realpath $(which $@))
PACKAGE=$(apt-file search $BINARY|grep -E ":\s*${BINARY}$")
echo ${PACKAGE%:*}

Mặc dù đối với hầu hết các THINGs bạn chỉ có thể sử dụng

apt-file search $(realpath $(which THING))|grep 'THING$'

2
2018-03-17 15:25



Alexx, tôi thích câu trả lời này. Tôi hy vọng bạn không nhớ chỉnh sửa của tôi. Tôi đã làm cho nó cũng làm việc cho các tập tin không được cài đặt trên hệ thống. Tôi đã thực hiện một bản sao lưu tại gist.github.com/RichardBronosky/… và sẽ tạo câu trả lời của riêng tôi nếu bạn hoàn nguyên / từ chối nó. - Bruno Bronosky
Cập nhật: Nó cảm thấy mỏng để sao chép mì ống câu trả lời này và thực hiện thay đổi tinh tế cho nó, nhưng chỉnh sửa của tôi đã bị từ chối. Tôi hy vọng bạn cảm thấy như tôi đã duy trì tính toàn vẹn của câu trả lời của bạn trong của tôi. - Bruno Bronosky
Vui lòng chỉnh sửa hoặc hack; bất cứ điều gì làm cho nó tốt hơn cho bạn, (đó là lý do tại sao tôi thêm Giấy phép MIT! Tôi thậm chí không cần tín dụng.) - Alexx Roche


Đây là phần mở rộng cho Câu trả lời tuyệt vời của Alexx Roche. Tôi đã cố chỉnh sửa câu trả lời đó, nhưng nó đã bị từ chối (mặc dù không phải bởi Alexx)


Tôi đã cố gắng theo dõi những gì đã cài đặt which trên hệ thống của tôi. Sau một chút công việc tôi đã tạo /usr/local/bin/apt-whatprovides

#!/bin/sh
#apt-whatprovides ver. 201801010101 Copyright alexx, MIT Licence
#rdfa:deps="[realpath,apt-file,grep,which,sh,echo]"

BINARY="$(realpath $(which $@) 2>/dev/null)"
[ -z "$BINARY" ] && BINARY="$@"
echo Searching for $BINARY
PACKAGE="$(apt-file search $BINARY|grep -E ":.*[^-.a-zA-Z0-9]${BINARY}$")"
echo "${PACKAGE}"

Mặc dù đối với hầu hết các THING được cài đặt, bạn chỉ có thể sử dụng:

apt-file search $(realpath $(which THING)) | grep 'THING$'

Đối với THING không được cài đặt, bạn có thể sử dụng:

apt-file search THING | grep '/THING$'

Các apt-whatprovides script hoạt động cho các tệp đang có và không có trên hệ thống của bạn. Ví dụ, hệ thống của tôi thiếu dig nhưng đã có ping do đó, điều này dẫn đến kết quả:

pi@raspberrypi:~ $ apt-whatprovides ping
Searching for /bin/ping
inetutils-ping: /bin/ping
iputils-ping: /bin/ping

pi@raspberrypi:~ $ apt-whatprovides dig
Searching for dig
dnsutils: /usr/bin/dig
epic4: /usr/share/epic4/script/dig
epic4-help: /usr/share/epic4/help/8_Scripts/dig
knot-dnsutils: /usr/bin/dig

Thông báo rằng Searching for là một con đường hoàn chỉnh cho ping (đã cài đặt) và chỉ tên nhị phân cho dig chưa cài đặt. Điều này đã giúp tôi khám phá ra rằng tôi cần cài đặt dnsutilsmà không cần phải tìm kiếm https://packages.ubuntu.com/#search_contents


2
2017-07-18 05:45



Đây là một câu trả lời tốt mà tôi nên xóa của tôi! - Alexx Roche


Một lý do bạn có thể phải làm điều này là nếu bạn đang biên dịch phần mềm đã có gói ubuntu, bạn có thể chạy apt-get build-dep $PACKAGENAME. Điều đó sẽ cài đặt tất cả các gói bạn cần để biên dịch $PACKAGENAME.


1
2017-08-11 19:31