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


468

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

Câu hỏi thưởng: 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ó, giả sử, một trang web sẽ cho phép tôi tìm kiếm một tập tin và xem những gói nào, nếu có, cung cấp nó?


6
Tôi đã luôn tự hỏi điều này - Tôi biết với YUM, bạn có thể thực hiện những gì cung cấp <filepath> / <tên tệp> nhưng tôi chưa bao giờ thực sự tìm thấy một giải pháp thay thế nào trong Aptitude ngoài trang web Gói
Marco Ceppi


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ư mailxhoặc sendmailkhông được bao gồm dưới dạng nhị phân trong bất kỳ gói nào ; thay vào đó, các gói khác nhau cài đặt nhị phân của riêng chúng và sau đó cung cấp một số trong số chúng dưới tên "chính tắc" thông qua /etc/alternatives. Xem thêm Askubfox.com/questions/366135/ khăn
tripleee

Câu trả lời:


439

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

Từ man dpkg:

-S, - tìm kiếm tên tệp-tìm kiếm-mẫu ...
                  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 với 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


5
Tôi rất 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

20
Gợi ý: nếu bạn không biết đường dẫn đầy đủ, nhưng chỉ cần tên lệnh, hãy sử dụng whichđể tìm chương trình của anh ấy:dpkg -S `which firefox`
Lekensteyn

1
@DanielTChen, nhưng dlocatecó thể không thực hiện công việc, nếu cơ sở dữ liệu của dlocate đã hết hạn. Bạn phải gọi sudo update-dlocatedbđể cập nhật nó.
jarno

2
Nếu dpkgđường dẫn chính xác không trả về bất cứ thứ gì (ví dụ dpkg /usr/bin/java), hãy thử chỉ tên của tệp thực thi (ví dụ dpkg java).
Dan Dascalescu

2
Bạn cũng có thể sử dụng realpathđể giải quyết các liên kết tượng trưng, ​​như thế này : dpkg -S $(realpath $(which <command>)).
Lars Nyström

236

Các apt-filelệ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-cachelà một lựa chọn khác.

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

sudo apt-get install apt-file

Sau đó, bạn cần 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 là sử dụng trang web Tìm kiếm Gói Ubuntu . 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 cụ thể.


21
Theo tôi đây nên là câu trả lời được chấp nhận. Nhưng để đáp ứng vớ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 cực kỳ thân thiện và dễ nhớ (một khi bạn biết). Nếu bạn sử dụng dpkg, apt-get hoặc aptitude làm công cụ tiêu chuẩn của mình, sẽ không có gì thân thiện về việc kích hoạt Chrome để lướt internet!
dùng2097818

3
@ 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-filethường tìm thấy dương tính giả, tức là các gói không được cài đặt. Tất nhiên câu trả lời này là tuyệt vời cho "câu hỏi tiền thưởng".
David Z

3
Đố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

Tôi aliased apt-file findnhư apt-findlâu lắm rồi và nó thực sự tiện dụng! Btw, phiên bản mới nhất yêu cầu root cho apt-file update.
val

43

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

apt-file list packagename


13

Ý bạn là, gói nào và không phải ứng dụng nào. Ứng dụng này là trình quản lý gói của bạn, vd 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.

nhập mô tả hình ảnh ở đây

Thí dụ

nhập mô tả hình ảnh ở đây


Ý bạn là, gói nào và không phải ứng dụng nào. Ứng dụng này là trình quản lý gói của bạn, ví dụ: Trung tâm phần mềm. Được chứ. 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ố này giúp tôi tìm thấy gói nào đã cài đặt ứng dụng này / các ứ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à tán của Enthoughts. EULA dài một dặm đó làm tôi nhớ đến Microsoft Windows cũ của tôi, với điều đó, 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 vào ngày hôm qua, vì vậy, khi root, tôi đã thoát khỏi nó, cùng với tán của Enthoughts và, tất cả các vấn đề đều được giải quyết. Tôi thực sự cảm ơn bạn vì tất cả 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

4

Đây là một phần mở rộng cho câu trả lời tuyệt vời của Alexx Roche . Tôi đã cố thực hiện một chỉnh sửa cho 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 cài đặt whichtrên hệ thống của tôi. Sau một công việc nhỏ tôi đã tạo ra/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 những điều chưa được cài đặt, bạn có thể sử dụng:

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

Các apt-whatprovideskịch bản làm việc cho các tập tin được và không phải trên hệ thống của bạn. Ví dụ, hệ thống của tôi thiếu dignhưng đã có pingkết quả như vậy:

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

Lưu ý rằng đó Searching forlà một đường dẫn đầy đủ cho ping(đã cài đặt) và chỉ tên nhị phân cho digkhông được 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.ubfox.com/#search_contents


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

3

Tôi đã cố gắng theo dõi những gì được cài đặt whichtrên hệ thống của tôi. Sau một chút công việc tôi đã tạo 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 điều bạn chỉ có thể sử dụng

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

1
Alexx, tôi thích câu trả lời này. Tôi hy vọng bạn không quan tâm đến chỉnh sửa của tôi. Tôi đã làm cho nó cũng hoạt động cho các tập tin không được cài đặt trên hệ thống. Tôi đã tạo 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: Cảm thấy nhếch nhác khi sao chép mì ống câu trả lời này và thực hiện các 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 tôi .
Bruno Bronosky

Hãy 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

2

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 ubfox, 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.

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.