วิธีแสดงรายการไฟล์ของแพ็คเกจ Debian โดยไม่ต้องติดตั้ง


284

คำสั่งนี้สามารถแสดงรายการเนื้อหาของแพ็คเกจที่ติดตั้งเท่านั้น

dpkg -L PACKAGENAME

แต่จะแสดงรายการเนื้อหาของแพ็คเกจที่ไม่ได้ติดตั้งเพื่อดูตัวอย่าง / ตรวจสอบแพ็คเกจได้อย่างไร


คำตอบ:


340

dpkg -c(หรือ--contents) แสดงรายการเนื้อหาของไฟล์แพ็คเกจ. deb (เป็นส่วนหน้าdpkg-debของ)

dpkg -c package_file.deb

apt-fileในการทำงานโดยตรงที่มีชื่อแพคเกจมากกว่าไฟล์แพคเกจนี้คุณสามารถใช้ (คุณอาจต้องติดตั้งapt-fileแพคเกจก่อน)

sudo apt-file update        
apt-file list package_name

ตามที่ระบุไว้ในความคิดเห็นแรกไฟล์ apt-list เนื้อหาสำหรับแพคเกจในคลังเก็บ Apt ของคุณกำหนดค่าแล้ว ไม่เกี่ยวข้องว่ามีแพ็คเกจใดเป็นพิเศษหรือไม่ได้ติดตั้ง


17
ไฟล์ apt-ต้องได้รับการอัพเดต ( sudo apt-file update) และแสดงเฉพาะเนื้อหาสำหรับแพ็คเกจในคลังข้อมูล Apt ที่กำหนดค่าไว้แล้วของคุณ
ต้มตุ๋น quixote

1
@quackquixote: ใน Ubuntu 12.04 มันเป็นไปโดยอัตโนมัติ
confiq

1
dpkg -cดี!
d -_- b

2
คำตอบไฟล์ฉลาดถือว่าแพคเกจของคุณมาจากพื้นที่เก็บข้อมูลที่กำหนดค่าแทน.debไฟล์ที่คุณดาวน์โหลดแยกต่างหาก คำถามเดิมไม่ชัดเจนแม้ว่า
Zoredache

5
@confiq ไม่ใช่โดยการทดสอบของฉัน ฉันกำลังเรียกใช้ 12.04.4 และยังคงบอกว่า "E: แคชว่างเปล่าคุณต้องเรียกใช้ 'apt-file update' ก่อน"
Matthew Flaschen

58

ใช้--contentsแทน-L:

dpkg --contents PACKAGENAME

เมื่อใช้ในลักษณะนี้dpkgทำหน้าที่เป็นส่วนหน้าของdpkg-debดังนั้นใช้man dpkg-debเพื่อดูตัวเลือกทั้งหมด

คุณยังสามารถใช้เบราว์เซอร์เก็บถาวรเพื่อดูเนื้อหาแพ็คเกจ


2
สิ่งนี้ไม่ทำงานเว้นแต่ฉันจะติดตั้งก่อนแล้วจึงถอนการติดตั้ง
XièJìléi

3
มันควรจะทำงานได้ดีถ้าคุณให้ไฟล์. deb เป็นอาร์กิวเมนต์ (แทนที่จะเป็น PACKAGENAME ให้ให้มัน PACKAGE-DEB-FILE)
ต้มตุ๋น Quixote

3
คำตอบนี้ผิด คุณต้องติดตั้งแพ็กเกจก่อน หากคุณไม่ได้ติดตั้งไว้แสดงว่าคุณไม่มีไฟล์. deb
Neil

คำสั่งนี้ใช้ได้สำหรับฉัน ตัวอย่างเช่นฉันดาวน์โหลด google-chrome-stable_current_amd64.deb จาก Google จากนั้นจึงออกคำสั่ง: dpkg --contents google-chrome-stable_current_amd64.debและจะแสดงรายการไฟล์ทั้งหมดที่จะติดตั้ง (ส่วนใหญ่เป็น/opt/google/chrome) ซึ่งไม่มีไฟล์ใดติดตั้งอยู่ในระบบของฉันขณะที่ฉันพิมพ์สิ่งนี้ (ฉันใช้ Xubuntu 11.10 ถ้าเป็นเช่นนั้น)
quux00

10
@ แม้คำตอบนั้นไม่ผิด เพียงเพราะคุณมีไฟล์ deb ไม่ได้หมายความว่าติดตั้งแล้ว apt-file ต้องการแพ็คเกจการสร้างที่จำเป็นทั้งหมด OO
d -_- b

21

dpkg --contentsจะให้คุณดูแพ็คเกจที่ถอนการติดตั้ง หาก. deb ไม่ได้อยู่ในระบบของคุณให้ทำ

apt-get --download-only install pkgname

แพ็คเกจจะถูกดาวน์โหลดไปยัง/var/cache/apt/archivesแต่ไม่ได้ติดตั้ง


3
ฉันสามารถแสดงรายการเนื้อหาโดยไม่ต้องดาวน์โหลดได้หรือไม่ ถ้าฉันเชื่อมต่อช้ามากและถ้าแพคเกจมีขนาดใหญ่เกินไปที่จะดาวน์โหลด หากไฟล์. deb มีส่วนหัวของไฟล์ที่มีรายการเนื้อหาฉันคิดว่าการดาวน์โหลดทั้งแพ็คเกจอาจไม่จำเป็น เป็นไปได้ไหม
XièJìléi

13

วิธีที่ดีที่สุดคือเรียกดูที่เก็บของแพ็คเกจโดยตรง:

http://packages.debian.org/[distro name]/all/[package name]/filelist

ตัวอย่าง:

http://packages.debian.org/wheezy/all/transmission-common/filelist


และเพื่อหลีกเลี่ยงการออกจากเครื่องคุณสามารถใช้เช่นlynx -dump -nolist http://packages.debian.org/wheezy/all/transmission-common/filelist | grep ^/(หากคุณได้lynxติดตั้งแล้ว)
Ruslan

8

ฉันใช้ความคิด http ของ @ baldozและทำให้เป็นมาตรฐานสำหรับ Ubuntu และ Debian เพิ่มเล็กน้อยsedและห่อไว้ในฟังก์ชันทุบตีหนึ่งซับ:

function deb_list () { curl -s $(lsb_release -si | sed -e 's Ubuntu https://packages.ubuntu.com ' -e 's Debian https://packages.debian.org ')/$(lsb_release -sc)/all/$1/filelist | sed -n -e '/<pre>/,/<\/pre>/p' | sed -e 's/<[^>]\+>//g' -e '/^$/d'; }

การใช้งาน:

$ deb_list curl
/usr/bin/curl
/usr/share/doc/curl/changelog.Debian.gz
/usr/share/doc/curl/copyright
/usr/share/doc/curl/NEWS.Debian.gz
/usr/share/man/man1/curl.1.gz

ฟังก์ชั่นเดียวกันในหลายบรรทัด:

function deb_list () {
    curl -s $(lsb_release -si \
                | sed -e 's Ubuntu https://packages.ubuntu.com ' \
                      -e 's Debian https://packages.debian.org '
              )/$(lsb_release -sc)/all/$1/filelist \
      | sed -n -e '/<pre>/,/<\/pre>/p' \
      | sed -e 's/<[^>]\+>//g' -e '/^$/d';
}

อธิบาย:

  1. lsb_release -si ส่งคืน "Ubuntu" หรือ "Debian" แทนที่ด้วย url ฐานhttps://packages.ubuntu.comหรือhttps://packages.debian.org
  2. lsb_Release -sc ส่งคืนชื่อรหัส (เช่น "trusty", "sid" ฯลฯ ) ใช้เพื่อสร้าง URL แบบเต็ม: https://packages.ubuntu.com/trusty/all/curl/filelist
  3. ดึง URL นั้นด้วย curl และไพพ์ html ผ่านคำสั่ง sed สามคำ ขั้นแรกจะรวบรวมเฉพาะรายการไฟล์ (สิ่งที่อยู่ระหว่าง<pre>และ</pre>แท็ก); แถบที่สองจะแยกแท็ก html ออก ที่สามลบบรรทัดว่างใด ๆ

หมายเหตุ: มันไม่ได้ค้นหา PPA, repos apt แหล่งที่มาอื่นและสืบค้นเฉพาะแพ็คเกจอย่างเป็นทางการที่มีให้สำหรับการเปิดตัวเดเบียน / อูบุนตูที่คุณใช้งานอยู่


ฉันจำเป็นต้องใช้ทับทิมหรือไม่
Anwar

1
@ อันวาร์ในตอนแรกฉันจะใช้ทับทิมเพราะฉันขี้เกียจและหลาย ๆ regexes ดูดซับใน sed / awk / grep แต่ฉันเขียนมันใหม่เพื่อใช้สองคำสั่ง sed โดยไม่จำเป็นต้องใช้ Ruby
notpeter

ดี! นี่คือคำตอบที่ฉันต้องการ
Anwar

4

สำหรับทุกคนที่ยังคง Google ปัญหานี้ในเดือนมกราคม 2017 คุณสามารถมีสิ่งที่ยอดเยี่ยมกับ apt และ dpkg รุ่นล่าสุดใน Debian 8.5 โดยไม่ต้องดาวน์โหลดอะไร

รายการเนื้อหาของไฟล์ Deb โดยไม่ต้องดาวน์โหลด:

ก่อนอื่นให้ค้นหา URL แบบเต็มของไฟล์ deb:

root@debian:apt-get --print-uris download yade
'http://httpredir.debian.org/debian/pool/main/y/yade/yade_2016.06a-7_amd64.deb' yade_2016.06a-7_amd64.deb 1621148 SHA256:26c0d84484a92ae9c2828edaa63243eb764378d79191149970926aa3ec40cdd4

PS: - สวิตช์พิมพ์ uris พิมพ์ URL ของแพคเกจ deb แต่ไม่ได้ดาวน์โหลด deb

จากนั้นแสดงเนื้อหาของแพ็คเกจ deb โดยไม่ต้องดาวน์โหลด:

root@debian:curl -sL -o- "http://httpredir.debian.org/debian/pool/main/y/yade/yade_2016.06a-7_amd64.deb" |dpkg-deb -c /dev/stdin
drwxr-xr-x root/root         0 2016-12-10 22:18 ./
drwxr-xr-x root/root         0 2016-12-10 22:18 ./usr/
drwxr-xr-x root/root         0 2016-12-10 22:18 ./usr/bin/
-rwxr-xr-x root/root     13184 2016-12-10 22:18 ./usr/bin/yade
.........................more files listed bellow ......................

PS: ผลลัพธ์เดียวกันสามารถทำได้ด้วย

root@debian:dpkg -c <(curl -sL -o- "http://httpredir.debian.org/debian/pool/main/y/yade/yade_2016.06a-7_amd64.deb")

แตกไฟล์จากแพ็คเกจ deb ข้างต้นโดยไม่ต้องดาวน์โหลด
ตัวอย่างเช่นเราต้องการอ่าน man page ของแพ็คเกจ yade โดยไม่ต้องติดตั้งแพ็คเกจนี้และไม่ต้องดาวน์โหลดแพ็คเกจ deb

ชื่อไฟล์ของ man page ภายในแพ็กเกจ deb ตามคำแนะนำdpkg -cคือ./usr/share/man/man1/yade.1.gz

หากต้องการอ่าน man page แบบทันที:

root@debian:curl -sL -o- "http://httpredir.debian.org/debian/pool/main/y/yade/yade_2016.06a-7_amd64.deb" |dpkg-deb --fsys-tarfile /dev/stdin |tar -xO ./usr/share/man/man1/yade.1.gz |man /dev/stdin

man page แสดงขึ้นอย่างถูกต้องโดยใช้ man application

PS: ท่อด้านบนไม่ทำงานกับคำสั่ง ar

root@debian:apt --version --> apt 1.4~beta2 (amd64)
root@debian:dpkg --version --> Debian 'dpkg' package management program version 1.18.18 (amd64).
root@debian:man --version --> man 2.7.6.1
root@debian:tar --version --> tar (GNU tar) 1.29

คำอธิบายนี้ใช้ได้กับระบบที่ใช้เพียง "apt" และไม่มีคำสั่ง "apt-x" ที่เก่ากว่า!
Jon Watte


1

ดูเหมือนว่าเป็นไปไม่ได้ก่อนที่จะติดตั้งก่อนหรือแยกรายชื่อจาก.debไฟล์

ลองคำสั่งต่อไปนี้:

dpkg --contents <(curl -s $(apt-get install --yes --no-download --reinstall --print-uris language-pack-en | tail -n1 | grep -o "http[^']\+"))

เปลี่ยนlanguage-pack-enด้วยชื่อแพ็คเกจของคุณ

มันเป็นพื้นอ่าน.debไฟล์สกัดผ่านcurlและทำงานdpkg --contents FILEกับมัน


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

ดังนั้นหากคุณทราบ URL ของ.debไฟล์คำสั่งเชลล์ต่อไปนี้จะแสดงรายการไฟล์แพ็กเกจทั้งหมด:

dpkg -c <(curl -sL "http://httpredir.debian.org/debian/pool/main/a/avis/avis_1.2.2-4_all.deb")

Curl params: -s- silent, -L- ติดตามลิงก์ที่ถูกย้าย

หากคุณไม่ทราบ URL ให้ดึงข้อมูลโดย: apt --print-uris, เช่น

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