題 如何在沒有安裝的情況下列出Debian軟件包的文件


此命令只能列出已安裝軟件包的內容,

dpkg -L PACKAGENAME

但如何列出未安裝包的內容,以預覽/檢查包?


259
2017-12-14 06:49


起源


類似於Ubuntu: askubuntu.com/questions/32507/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


答案:


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-file列出已配置的Apt存儲庫中的包的內容。是否安裝任何特定包是無關緊要的。


310
2017-12-14 15:42



apt-file也需要更新(sudo apt-file update),並且僅列出已配置的Apt存儲庫中的包的內容。 - quack quixote
@quackquixote:在Ubuntu 12.04中它是自動的 - confiq
dpkg -c 太好了! - d-_-b
Apt文件的答案假定您的軟件包來自已配置的存儲庫而不是 .deb 您已單獨下載的文件。但最初的問題是模棱兩可的。 - Zoredache
@confiq,不是我的測試。我正在運行12.04.4,它仍然說“E:緩存是空的。你需要先運行'apt-file update'。” - Matthew Flaschen


使用 --contents 代替 -L

dpkg --contents PACKAGENAME

以這種方式使用時, dpkg 充當前端 dpkg-deb,所以使用 man dpkg-deb 看到所有的選擇。

您還可以使用存檔瀏覽器查看包內容。


54
2017-12-14 08:14



除非我先安裝它然後卸載它,否則這不起作用。 - Xiè Jìléi
如果你給它一個.deb文件作為參數(而不是PACKAGENAME,給它PACKAGE-DEB-FILE)它應該工作正常。 - quack quixote
這個答案是對的。您必須先安裝軟件包。如果您沒有安裝它,那麼您沒有.deb文件。 - Neil
這個命令對我有用。例如,我從Google下載了google-chrome-stable_current_amd64.deb。然後發出命令: dpkg --contents google-chrome-stable_current_amd64.deb 它列出了它將安裝的所有文件(主要是 /opt/google/chrome),當我鍵入它時,我的系統上當前沒有安裝任何一個。 (如果重要的話,我正在運行Xubuntu 11.10。) - quux00
@Neil,答案沒有錯。僅僅因為你有一個deb文件,並不意味著它已經安裝。 apt-file需要整個構建必需的包。 O.O - d-_-b


dpkg --contents 將讓你看看卸載的包。如果.deb尚未在您的系統上,請執行

apt-get --download-only install pkgname

該軟件包將被下載到 /var/cache/apt/archives 但沒有安裝。


18
2017-12-14 14:34



我可以直接列出內容而無需下載嗎?如果我連接速度很慢,並且包裹太大而無法下載。如果.deb文件有一個文件頭,其中的內容列表,我猜可能沒有必要下載整個包。這可能嗎? - Xiè Jìléi


最好的方法是直接瀏覽包存儲庫:

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

例:

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


11
2018-06-01 13:57



並且為了避免離開終端,您可以使用例如 lynx -dump -nolist http://packages.debian.org/wheezy/all/transmission-common/filelist | grep ^/ (只要你有 lynx 安裝)。 - Ruslan


我拿了 @ baldoz的http想法 並為Ubuntu和Debian推廣它,添加了一點sed並將其包裝在一個bash函數中:

function deb_list () { curl -s $(lsb_release -si | sed -e 's Ubuntu http://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 http://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 http://packages.ubuntu.com 要么 https://packages.debian.org
  2. lsb_Release -sc返回代號(例如“trusty”,“sid”等)用於構建完整的URL: http://packages.ubuntu.com/trusty/all/curl/filelist
  3. 使用curl獲取該URL並通過三個sed命令管道html。首先只捕獲文件列表(介於兩者之間) <pre> 和 </pre> 標籤);第二個刪除任何html標籤;第三個刪除任何空行。

注意:它不搜索PPA,替代apt源repos,只查詢可用於發布你正在運行的debian / ubuntu的官方軟件包。


7
2018-04-21 21:44



我需要紅寶石來運行嗎? - Anwar
@Anwar,我最初使用的是Ruby,因為我很懶,而且多行正則表達式在sed / awk / grep中很糟糕。但我已經重寫它以使用兩個sed命令,不需要Ruby。 - notpeter
太好了!這是我正在尋找的答案 - Anwar


嘗試:

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

2
2018-06-27 15:28





似乎在首先安裝它或從中提取列表之前是不可能的 .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 文件,以下shell命令將列出所有包文件:

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

捲曲參數: -s - 無聲, -L  - 按照移動的鏈接。

如果您不知道URL,請按以下方式獲取: apt --print-uris,例如

apt --print-uris install avis | grep avis

1
2017-12-27 13:33