Bagaimana cara menemukan paket yang menyediakan file?

468

Pertanyaan yang cukup sederhana: apakah ada perintah shell (atau metode GUI) yang bisa saya gunakan, mengingat path ke file di sistem saya, memberi tahu saya paket apa yang meletakkannya di sana? Dengan asumsi file tersebut memang berasal dari paket, yaitu.

Pertanyaan bonus: bagaimana jika itu adalah file yang tidak diinstal pada sistem saya? Apakah ada, katakanlah, sebuah situs web yang akan membiarkan saya mencari file dan melihat paket apa, jika ada, menyediakannya?

David Z
sumber
6
Saya selalu bertanya-tanya sendiri - Saya tahu dengan YUM Anda dapat melakukan yum apa yang memberikan <filepath> / <filename> tapi saya tidak pernah benar-benar menemukan alternatif untuk itu di Aptitude selain situs web Paket
Marco Ceppi
Sama dengan SU: superuser.com/questions/10997/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
Tidak ada jawaban di sini yang benar-benar membahas Provides:mekanisme tersebut. Dalam beberapa detail, perintah suka mailxatau sendmailtidak dimasukkan sebagai biner dalam paket apa pun ; sebaliknya, berbagai paket menginstal binari mereka sendiri dan kemudian membuat beberapa dari mereka tersedia dengan nama "kanonik" via /etc/alternatives. Lihat juga askubuntu.com/questions/366135/…
tripleee

Jawaban:

439

Anda dapat menggunakan dpkgperintah untuk mengetahui paket yang diinstal memiliki file:

Dari man dpkg:

-S, - nama file pencarian-pola pencarian ...
                  Cari nama file dari paket yang diinstal.

Contoh:

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

Anda dapat mencari dengan path lengkap atau hanya dengan nama file.

Jika Anda ingin mencari file yang belum diinstal di komputer Anda, Anda dapat menggunakan Pencarian Paket Ubuntu

Ressu
sumber
5
Saya sangat merekomendasikan menggunakan dlocate, yang diperbarui setiap hari untuk pencarian yang lebih cepat.
Daniel T Chen
20
Petunjuk: jika Anda tidak tahu path lengkap, tetapi hanya nama perintah, gunakan whichuntuk menemukan dia memprogram:dpkg -S `which firefox`
Lekensteyn
1
@ DanielTChen, tetapi dlocatemungkin tidak melakukan pekerjaan, jika database dlocate kedaluwarsa. Anda harus menelepon sudo update-dlocatedbuntuk memperbaruinya.
jarno
2
Jika dpkgjalur yang tepat tidak mengembalikan apa pun (misalnya dpkg /usr/bin/java), coba saja nama yang dapat dieksekusi (mis dpkg java.)
Dan Dascalescu
2
Anda juga dapat menggunakan realpathuntuk menyelesaikan symlink, seperti ini: dpkg -S $(realpath $(which <command>)).
Lars Nyström
237

The apt-fileperintah dapat melakukan ini untuk Anda dari baris perintah. Saya sering menggunakannya ketika membangun paket dari sumber. Untuk file yang disediakan oleh paket yang sudah diinstal pada sistem Anda, apt-cacheadalah pilihan lain.

Untuk menginstal apt-file, lakukan:

sudo apt-get install apt-file

Kemudian, Anda perlu memperbarui basis datanya:

apt-file update

Dan, akhirnya, cari file:

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

Namun cara yang lebih ramah adalah dengan menggunakan situs web Pencarian Paket Ubuntu . Mereka memiliki opsi untuk "mencari isi paket" untuk nama file tertentu.

jbowtie
sumber
21
Menurut pendapat saya ini harus menjadi jawaban yang diterima. Tetapi sebagai tanggapan terhadap Pencarian Paket Ubuntu , saya mungkin berpendapat bahwa program shell yang sederhana ini sangat ramah dan mudah diingat (setelah Anda mengetahuinya). Jika Anda menggunakan dpkg, apt-get, atau aptitude sebagai alat standar Anda, tidak ada yang ramah tentang menyalakan Chrome untuk menjelajahi internet!
user2097818
3
@ user2097818 Alasan ini bukan jawaban yang diterima adalah pertanyaan utama saya terbatas pada file pada sistem dan paket yang diinstal. apt-filesering menemukan positif palsu, yaitu paket yang tidak diinstal. Tentu saja jawaban ini bagus untuk "pertanyaan bonus".
David Z
3
Bagi mereka yang dari sisi Redhat dunia - apt-file search <>adalah analog terdekat dnf/yum whatprovides <>.
meraba
Saya alias apt-file findsejak apt-findlama dan itu sangat berguna! Btw, versi terbaru membutuhkan root untuk apt-file update.
val
43

Ada juga file apt untuk mencari file dalam paket yang tidak diinstal. Sebagai contoh:

apt-file list packagename
PTman
sumber
13

Maksud Anda, paket mana dan bukan aplikasi mana. Aplikasi ini adalah manajer paket Anda, mis Software Center.

Menggunakan dpkg:

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

Contoh

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

Menggunakan apt-file:

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

atau mungkin juga:

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

Contoh

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

Atau online di sini , di bagian ini Search the contents of packages.

masukkan deskripsi gambar di sini

Contoh

masukkan deskripsi gambar di sini

AB
sumber
Maksud Anda, paket mana dan bukan aplikasi mana. Aplikasi ini adalah manajer paket Anda, mis. Pusat Perangkat Lunak. Baik. Terima kasih! :)
ReyKev
Terima kasih atas semua bantuannya! Tidak satu pun dari saran ini yang membantu saya menemukan paket mana yang menginstal aplikasi ini / ini. Semua pencarian hanya mengarah kembali ke "Pelacak". Saya menduga itu kanopi Enthoughts '. EULA yang panjang satu mil mengingatkan saya pada Microsoft Windows linglung lama saya, dengan yang, saya sangat senang saya tidak lagi terlibat. Saya melihat bahwa Tracker telah diinstal kemarin jadi, sebagai root, saya menyingkirkannya, bersama dengan Enthoughts 'Canopy dan, semua masalah terpecahkan. Saya sangat berterima kasih atas semua bantuan Anda. Sungguh luar biasa mendapat dukungan seperti itu. Terima kasih lagi! Kevin
ReyKev
4

Ini adalah ekstensi untuk jawaban luar biasa Alexx Roche . Saya mencoba mengedit jawaban itu, tetapi ditolak (meskipun tidak oleh Alexx)


Saya mencoba melacak apa yang diinstal whichpada sistem saya. Setelah sedikit kerja saya buat/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}"

Meskipun untuk sebagian besar HAL yang diinstal Anda hanya dapat menggunakan:

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

Untuk HAL yang tidak diinstal, Anda dapat menggunakan:

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

The apt-whatprovidesScript bekerja untuk file yang dan tidak pada sistem Anda. Sebagai contoh, sistem saya kurang digtetapi memiliki pingini sehingga hasilnya:

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

Perhatikan bahwa itu Searching foradalah path lengkap untuk ping(diinstal) dan hanya nama biner untuk digtidak diinstal. Ini membantu saya menemukan bahwa saya perlu menginstal dnsutilstanpa perlu mencari https://packages.ubuntu.com/#search_contents

Bruno Bronosky
sumber
Ini adalah jawaban yang bagus sehingga saya harus menghapus milik saya!
Alexx Roche
3

Saya mencoba melacak apa yang diinstal whichpada sistem saya. Setelah sedikit kerja saya membuat 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%:*}

Padahal untuk sebagian besar HAL Anda hanya bisa menggunakan

apt-file search $(realpath $(which THING))|grep 'THING$'
Alexx Roche
sumber
1
Alexx, saya suka jawaban ini. Saya harap Anda tidak keberatan edit saya. Saya membuatnya juga berfungsi untuk file yang tidak diinstal pada sistem. Saya membuat cadangan di gist.github.com/RichardBronosky/… dan akan membuat jawaban saya sendiri jika Anda mengembalikan / menolaknya.
Bruno Bronosky
Pembaruan: Rasanya licin untuk menyalin pasta jawaban ini dan membuat perubahan halus untuk itu, tetapi edit saya ditolak. Saya harap Anda merasa seperti saya menjaga integritas jawaban Anda di saya .
Bruno Bronosky
Merasa bebas untuk mengedit atau meretas; apa pun yang membuatnya lebih baik untuk Anda, (itulah mengapa saya menambahkan Lisensi MIT! Saya bahkan tidak memerlukan kredit.)
Alexx Roche
2

Salah satu alasan Anda mungkin harus melakukan ini adalah jika Anda mengkompilasi perangkat lunak yang sudah ada paket ubuntu, Anda dapat menjalankannya apt-get build-dep $PACKAGENAME. Itu akan menginstal semua paket yang Anda butuhkan untuk dikompilasi $PACKAGENAME.

Rory
sumber