Cách liệt kê các tệp của gói Debian mà không cần cài đặt


284

Lệnh này chỉ có thể liệt kê nội dung của các gói đã cài đặt,

dpkg -L PACKAGENAME

nhưng làm thế nào để liệt kê nội dung của gói không được cài đặt, để xem trước / kiểm tra gói?


Tương tự như vậy trên Ubuntu: Askubfox.com/questions/32507/ trên
Ciro Santilli

Câu trả lời:


340

dpkg -c(hoặc --contents) liệt kê nội dung của tệp gói .deb (Đây là giao diện người dùng dpkg-deb.)

dpkg -c package_file.deb

Để làm việc trực tiếp với tên gói chứ không phải tệp gói, bạn có thể sử dụng apt-file. (Bạn có thể cần cài đặt apt-filegói đầu tiên.)

sudo apt-file update        
apt-file list package_name

Như đã nêu trong nhận xét đầu tiên, tệp apt liệt kê nội dung cho các gói trong kho Apt đã được cấu hình của bạn. Nó không liên quan cho dù bất kỳ gói cụ thể là hoặc không được cài đặt.


17
tập tin apt cũng cần được cập nhật ( sudo apt-file update) và chỉ liệt kê nội dung cho các gói trong kho Apt đã được cấu hình của bạn.
quack quixote

1
@quackquixote: Trong Ubuntu 12.04, nó tự động
confiq

1
dpkg -cđẹp!
d -_- b

2
Câu trả lời tệp Apt giả định rằng gói của bạn đến từ kho lưu trữ được định cấu hình thay vì .debtệp bạn đã tải xuống riêng. Câu hỏi ban đầu là mơ hồ.
Zoredache

5
@confiq, không phải do tôi thử nghiệm. Tôi đang chạy 12.04.4 và nó vẫn báo "E: Bộ đệm trống. Bạn cần chạy 'cập nhật tệp apt' trước."
Matthew Flaschen

58

Sử dụng --contentsthay vì -L:

dpkg --contents PACKAGENAME

Khi được sử dụng theo cách này, dpkghoạt động như một giao diện người dùng dpkg-deb, vì vậy hãy sử dụng man dpkg-debđể xem tất cả các tùy chọn.

Bạn cũng có thể sử dụng trình duyệt lưu trữ để xem nội dung gói.


2
Điều này không hoạt động trừ khi tôi cài đặt nó trước và sau đó gỡ cài đặt nó.
Xiè Jìléi

3
nó sẽ hoạt động tốt nếu bạn cung cấp cho nó một tệp .deb làm đối số (thay vì PACKAGENAME, hãy cung cấp cho nó GÓI-DEB-FILE).
quack quixote

3
Câu trả lời này là sai. Bạn phải cài đặt gói đầu tiên. Nếu bạn chưa cài đặt nó, thì bạn không có tệp .deb.
Neil

Lệnh này hoạt động với tôi. Ví dụ: tôi đã tải xuống google-chrome-ổn_cản_amd64.deb từ Google. Sau đó ban hành lệnh: dpkg --contents google-chrome-stable_current_amd64.debvà nó liệt kê ra tất cả các tệp mà nó sẽ cài đặt (chủ yếu là /opt/google/chrome), không có tệp nào hiện được cài đặt trên hệ thống của tôi khi tôi nhập tệp này. (Tôi đang chạy Xubfox 11.10 nếu có vấn đề.)
quux00

10
@Neil, câu trả lời không sai. Chỉ vì bạn có tệp gỡ lỗi, không có nghĩa là nó đã được cài đặt. apt-file cần toàn bộ gói xây dựng cần thiết. OO
d -_- b

21

dpkg --contentssẽ cho phép bạn nhìn vào gói đã gỡ cài đặt. Nếu .deb chưa có trên hệ thống của bạn, hãy làm

apt-get --download-only install pkgname

Gói sẽ được tải xuống /var/cache/apt/archivesnhưng không được cài đặt.


3
Tôi chỉ có thể liệt kê các nội dung mà không cần tải về nó? Nếu tôi đang kết nối rất chậm và nếu gói quá lớn để tải xuống. Nếu tệp .deb có tiêu đề tệp nơi danh sách nội dung đi, tôi đoán tải xuống toàn bộ gói có thể không cần thiết. Điều này có thể không?
Xiè Jìléi

13

Cách tốt nhất là duyệt trực tiếp kho lưu trữ gói:

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

Thí dụ:

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


Và để tránh rời khỏi thiết bị đầu cuối, bạn có thể sử dụng ví dụ lynx -dump -nolist http://packages.debian.org/wheezy/all/transmission-common/filelist | grep ^/(với điều kiện bạn đã lynxcài đặt).
Ruslan

8

Tôi đã lấy ý tưởng http của @ baldoz và khái quát nó cho Ubuntu và Debian, thêm một chút sedvà gói nó trong hàm bash one-liner:

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'; }

Sử dụng:

$ 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

Cùng một chức năng trên nhiều dòng:

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';
}

Giải thích:

  1. lsb_release -si trả lại "Ubuntu" hoặc "Debian" thay thế bằng url cơ sở https://packages.ubuntu.comhoặchttps://packages.debian.org
  2. lsb_Release -sc trả về tên mã (ví dụ: "đáng tin cậy", "sid", v.v.) sử dụng để xây dựng URL đầy đủ: https://packages.ubuntu.com/trusty/all/curl/filelist
  3. Tìm nạp URL đó bằng curl và dẫn html thông qua ba lệnh sed. Đầu tiên chỉ chụp danh sách tệp (những gì nằm giữa <pre></pre>thẻ); thứ hai loại bỏ bất kỳ thẻ html nào; thứ ba loại bỏ bất kỳ dòng trống.

Lưu ý: Nó không tìm kiếm PPA, repos nguồn apt thay thế và chỉ truy vấn các gói chính thức có sẵn để phát hành debian / ubfox bạn đang chạy.


Tôi có cần ruby ​​để chạy nó không?
Anwar

1
@Anwar, ban đầu tôi đã sử dụng Ruby vì tôi lười biếng và các chế độ đa cấp hút trong sed / awk / grep. Nhưng tôi đã viết lại nó để sử dụng hai lệnh sed, không cần Ruby.
báo

Đẹp! Đây là câu trả lời tôi đang tìm kiếm
Anwar

4

Đối với tất cả những người vẫn có thể giải quyết vấn đề này vào tháng 1 năm 2017, bạn có thể có một số nội dung thú vị với các phiên bản apt và dpkg gần đây trong Debian 8.5 mà không cần tải xuống bất cứ điều gì.

Danh sách nội dung của tệp Deb mà không cần tải xuống:

Đầu tiên xác định url đầy đủ của tệp 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: --print-uris switch in url của gói deb nhưng deb không được tải xuống.

Sau đó hiển thị nội dung của gói deb mà không cần tải xuống:

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: Kết quả tương tự có thể đạt được với

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

Trích xuất một tập tin từ gói deb trên mà không cần tải xuống.
Ví dụ, chúng tôi muốn đọc trang man của gói yade mà không cần cài đặt gói này và thậm chí không tải xuống gói deb.

Filename of the page người đàn ông bên trong gói deb như tư vấn bởi dpkg -c./usr/share/man/man1/yade.1.gz

Để đọc trang người đàn ông trên bay:

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

trang man được hiển thị chính xác bằng ứng dụng man.

PS: Đường ống trên không hoạt động với lệnh 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

Mô tả này hoạt động cho các hệ thống chỉ sử dụng "apt" và không có sẵn các lệnh "apt-x" cũ hơn!
Jon Watte

2

Thử:

apt-get download packages-name
dpkg --contents *.deb

1

Có vẻ như không thể trước khi cài đặt nó trước hoặc trích xuất danh sách từ .debtệp.

Hãy thử lệnh sau:

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

Thay đổi language-pack-envới tên gói của bạn.

Về cơ bản nó đọc .debtập tin được trích xuất thông qua curlvà chạy dpkg --contents FILEtrên nó.


Bạn cũng có thể kiểm tra nội dung mà không cần tải tập tin gói.

Vì vậy, nếu bạn biết URL của .debtệp, lệnh shell sau sẽ liệt kê tất cả các tệp gói:

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

Curl params: -s- im lặng, -L- theo liên kết di chuyển.

Nếu bạn không biết URL, hãy tìm nạp theo : apt --print-uris, vd

apt --print-uris install avis | grep avis
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.