ฉันจะค้นหาแพ็คเกจที่ให้ไฟล์ได้อย่างไร


467

คำถามง่ายพอ: มีคำสั่งเชลล์ (หรือวิธี GUI) ฉันสามารถใช้ที่กำหนดเส้นทางไปยังไฟล์ในระบบของฉันบอกฉันว่าแพคเกจวางไว้ที่นั่นหรือไม่ ในความเป็นจริงแล้วไฟล์มาจากแพคเกจนั่นคือ

คำถามโบนัส: จะเป็นอย่างไรถ้าเป็นไฟล์ที่ไม่ได้ติดตั้งในระบบของฉัน มีพูดเว็บไซต์ที่จะให้ฉันค้นหาไฟล์และดูแพคเกจถ้ามีให้?


6
ฉันสงสัยอยู่เสมอว่าตัวเอง - ฉันรู้ด้วย YUM คุณสามารถทำอะไรให้ยำ <filepath> / <filename> แต่ฉันไม่เคยพบทางเลือกอื่นในความถนัดนอกเหนือจากเว็บไซต์แพ็คเกจ
Marco Ceppi


ไม่มีคำตอบใด ๆ ที่นี่ที่จริงครอบคลุมProvides:กลไก ในรายละเอียดเพิ่มเติมคำสั่งเช่นmailxหรือsendmailไม่รวมอยู่ในไบนารีในแพ็คเกจใด ๆ แทนการติดตั้งแพคเกจต่างๆไบนารีของตัวเองแล้วทำให้บางส่วนของพวกเขาที่มีอยู่ภายใต้ "บัญญัติ" /etc/alternativesชื่อผ่านทาง ดูเพิ่มเติมaskubuntu.com/questions/366135/…
tripleee

คำตอบ:


438

คุณสามารถใช้dpkgคำสั่งเพื่อค้นหาแพ็คเกจที่ติดตั้งซึ่งเป็นเจ้าของไฟล์:

จากman dpkg:

-S, - ค้นหาชื่อไฟล์ - รูปแบบการค้นหา ...
                  ค้นหาชื่อไฟล์จากแพ็คเกจที่ติดตั้ง

ตัวอย่าง:

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

คุณสามารถค้นหาด้วยเส้นทางแบบเต็มหรือเพียงแค่ชื่อไฟล์

หากคุณต้องการค้นหาไฟล์ที่ยังไม่ได้ติดตั้งในคอมพิวเตอร์ของคุณคุณสามารถใช้แพ็คเกจค้นหา Ubuntu ได้


5
ฉันขอแนะนำให้ใช้ dlocate ซึ่งอัปเดตทุกวันเพื่อการค้นหาที่เร็วขึ้น
Daniel T Chen

20
คำแนะนำ: ถ้าคุณไม่ทราบเส้นทางแบบเต็ม แต่เพียงชื่อคำสั่งให้ใช้whichเพื่อค้นหาโปรแกรม:dpkg -S `which firefox`
Lekensteyn

1
@DanielTChen แต่dlocateอาจไม่ทำงานหากฐานข้อมูลของ dlocate ล้าสมัย คุณต้องโทรsudo update-dlocatedbเพื่ออัปเดต
jarno

2
หากdpkgเส้นทางที่แน่นอนไม่ส่งคืนสิ่งใด (เช่นdpkg /usr/bin/java) ให้ลองใช้ชื่อของไฟล์ที่เรียกทำงานได้ (เช่นdpkg java)
Dan Dascalescu

2
นอกจากนี้คุณยังสามารถใช้realpathในการแก้ไข symlinks dpkg -S $(realpath $(which <command>))เช่นนี้
Lars Nyström

236

apt-fileคำสั่งสามารถทำเช่นนี้สำหรับคุณจากบรรทัดคำสั่ง ฉันใช้บ่อยเมื่อสร้างแพ็คเกจจากแหล่งที่มา สำหรับไฟล์ที่จัดทำโดยแพ็คเกจที่ติดตั้งไว้แล้วในระบบของคุณapt-cacheเป็นอีกทางเลือกหนึ่ง

ในการติดตั้งapt-fileทำ:

sudo apt-get install apt-file

จากนั้นคุณต้องอัปเดตฐานข้อมูลของมัน:

apt-file update

และในที่สุดค้นหาไฟล์:

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

แต่เป็นวิธีที่เป็นมิตรมากคือการใช้แพคเกจการค้นหา Ubuntuเว็บไซต์ พวกเขามีตัวเลือก "ค้นหาเนื้อหาของแพ็คเกจ" สำหรับชื่อไฟล์ที่เฉพาะเจาะจง


21
ในความคิดของฉันนี้ควรเป็นคำตอบที่ยอมรับ แต่ในการตอบสนองต่อการค้นหาแพคเกจของ Ubuntuฉันอาจยืนยันว่าโปรแกรมเชลล์นี้ง่าย ๆ เป็นมิตรและจดจำได้ง่าย (เมื่อคุณรู้) หากคุณใช้ dpkg, apt-get หรือ aptitude เป็นเครื่องมือมาตรฐานของคุณไม่มีอะไรที่เป็นมิตรกับการใช้ Chrome ในการท่องอินเทอร์เน็ต!
user2097818

3
@ user2097818 เหตุผลนี้ไม่ใช่คำตอบที่ยอมรับได้คือคำถามหลักของฉันถูก จำกัด เฉพาะไฟล์ในระบบและแพ็คเกจที่ติดตั้ง apt-fileมักจะพบผลบวกปลอมเช่นแพ็คเกจที่ไม่ได้ติดตั้ง แน่นอนคำตอบนี้ยอดเยี่ยมสำหรับ "คำถามโบนัส"
David Z

3
สำหรับผู้ที่มาจากด้าน Redhat ของโลก - เป็นอะนาล็อกที่อยู่ใกล้apt-file search <> dnf/yum whatprovides <>
ffledgling

ฉันใช้นามแฝงapt-file findเมื่อapt-findนานมาแล้วและมันมีประโยชน์จริงๆ! Btw, apt-file updateรุ่นล่าสุดต้องมีราก
วาล

43

นอกจากนี้ยังมี apt-file สำหรับค้นหาไฟล์ในแพ็คเกจที่ไม่ได้ติดตั้ง ตัวอย่างเช่น:

apt-file list packagename

17

คุณสามารถค้นหาเนื้อหาของแพ็คเกจที่รวมอยู่ใน Ubuntu รุ่นต่างๆบนเว็บไซต์แพคเกจ Ubuntu ดูที่หัวข้อ " ค้นหาเนื้อหาของแพ็คเกจ "

ตัวอย่างเช่นนี่คือผลการค้นหาสำหรับ libnss3.so ใน lucid (10.04):

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


นี่เพิ่งจะส่งกลับข้อผิดพลาด
Pawel Veselov

13

คุณหมายถึงแพ็คเกจใดและไม่ใช่แอปพลิเคชันใด Software Centerการประยุกต์ใช้เป็นแพคเกจผู้จัดการของคุณเช่น

การใช้dpkg:

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

ตัวอย่าง

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

การใช้apt-file:

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

หรือเป็นไปได้:

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

ตัวอย่าง

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

หรือทางออนไลน์ที่นี่Search the contents of packagesในส่วน

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่าง

ป้อนคำอธิบายรูปภาพที่นี่


คุณหมายถึงแพ็คเกจใดและไม่ใช่แอปพลิเคชันใด แอปพลิเคชั่นนี้เป็นผู้จัดการแพ็คเกจของคุณเช่น Software Center ถูก ขอขอบคุณ! :)
ReyKev

ขอบคุณสำหรับความช่วยเหลือ! ไม่มีคำแนะนำเหล่านี้ช่วยฉันค้นหาแพ็คเกจที่ติดตั้ง / แอปพลิเคชันเหล่านี้ได้ การค้นหาทั้งหมดนำกลับไปที่ "ตัวติดตาม" ฉันสงสัยว่ามันเป็นหลังคาของทางความคิด ไมล์ที่ยาวนาน EULA เตือนฉันถึงความงงงวย Microsoft Windows เก่าของฉันด้วยซึ่งฉันดีใจที่ฉันไม่ได้มีส่วนเกี่ยวข้องอีกต่อไป ฉันเห็นว่าตัวติดตั้งตัวติดตามได้รับการติดตั้งเมื่อวานนี้ในฐานะที่เป็นรูตฉันจึงกำจัดมันไปพร้อมกับหลังคาของ Enceants และปัญหาทั้งหมดได้รับการแก้ไข ฉันขอขอบคุณสำหรับความช่วยเหลือของคุณ มันเป็นเรื่องดีที่จะได้รับการสนับสนุน ขอบคุณอีกครั้ง! Kevin
ReyKev

4

นี้เป็นส่วนขยายไปยังคำตอบที่ดี Alexx โรช ฉันพยายามแก้ไขคำตอบนั้น แต่มันถูกปฏิเสธ (แต่ไม่ใช่ Alexx)


ฉันพยายามติดตามสิ่งที่ติดตั้งwhichบนระบบของฉัน หลังจากทำงานเล็กน้อยฉันก็สร้าง/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}"

แม้ว่าสิ่งที่ติดตั้งส่วนใหญ่คุณสามารถใช้:

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

สำหรับสิ่งที่ไม่ได้ติดตั้งคุณสามารถใช้:

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

apt-whatprovidesสคริปต์ทำงานสำหรับไฟล์ที่มีและไม่ได้อยู่ในระบบของคุณ ตัวอย่างเช่นระบบของฉันขาดdigแต่มีpingสิ่งนี้สิ่งที่เกิดขึ้น:

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

ขอให้สังเกตว่าSearching forเป็นเส้นทางที่สมบูรณ์สำหรับping(ติดตั้ง) และเพียงชื่อไบนารีสำหรับdigไม่ได้ติดตั้ง สิ่งนี้ช่วยให้ฉันค้นพบว่าฉันต้องติดตั้งdnsutilsโดยไม่จำเป็นต้องไปค้นหาhttps://packages.ubuntu.com/#search_contents


นี่เป็นคำตอบที่ดีที่ฉันควรจะลบของฉัน!
Alexx Roche

3

ฉันพยายามติดตามสิ่งที่ติดตั้งwhichบนระบบของฉัน หลังจากทำงานเล็กน้อยฉันสร้าง 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%:*}

ถึงแม้ว่าสำหรับสิ่งส่วนใหญ่คุณสามารถใช้

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

1
Alexx ฉันรักคำตอบนี้ ฉันหวังว่าคุณจะไม่สนใจการแก้ไขของฉัน ฉันทำมันยังใช้งานได้กับไฟล์ที่ไม่ได้ติดตั้งไว้ในระบบ ฉันสำรองข้อมูลไว้ที่gist.github.com/RichardBronosky/และจะสร้างคำตอบของฉันเองหากคุณเปลี่ยน / ปฏิเสธ
Bruno Bronosky

อัปเดต: รู้สึกลื่นไหลในการคัดลอกพาสต้าคำตอบนี้และทำการเปลี่ยนแปลงเล็กน้อย แต่การแก้ไขของฉันถูกปฏิเสธ ฉันหวังว่าคุณรู้สึกเหมือนฉันคงความสมบูรณ์ของคำตอบของคุณในเหมือง
Bruno Bronosky

อย่าลังเลที่จะแก้ไขหรือแฮ็ค อะไรก็ตามที่ทำให้ดีขึ้นสำหรับคุณ (นั่นคือเหตุผลที่ฉันเพิ่ม MIT License! ฉันไม่จำเป็นต้องมีเครดิต)
Alexx Roche

2

apt-get build-dep $PACKAGENAMEเหตุผลหนึ่งที่คุณอาจจะต้องทำเช่นนี้คือถ้าคุณกำลังรวบรวมซอฟแวร์ที่มีอยู่แล้วเป็นแพคเกจอูบุนตูคุณสามารถเรียกใช้ $PACKAGENAMEที่จะติดตั้งแพคเกจทั้งหมดที่คุณต้องการที่จะรวบรวม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.