如何在不安装的情况下列出Debian软件包的文件


Answers:


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-file列出了已配置的Apt存储库中软件包的内容。是否安装任何特定的软件包都无关紧要。


17
apt-file也需要更新(sudo apt-file update),并且仅列出您已配置的Apt存储库中软件包的内容。
quack quixote

1
@quackquixote:在Ubuntu 12.04中是自动的
确认2012年

1
dpkg -c真好!
d -_- b

2
Apt文件答案假定您的软件包来自配置的存储库,而不是.deb单独下载的文件。最初的问题虽然模棱两可。
Zoredache

5
@confiq,不是经过我的测试。我正在运行12.04.4,它仍然显示“ E:缓存为空。您需要先运行'apt-file update'。”
Matthew Flaschen 2014年

58

使用--contents代替-L

dpkg --contents PACKAGENAME

以这种方式使用时,dpkg充当的前端dpkg-deb,因此请使用man dpkg-deb来查看所有选项。

您也可以使用存档浏览器查看软件包内容。


2
除非我先安装然后再将其卸载,否则这是行不通的。
耶利耶09年

3
如果给它一个.deb文件作为参数,它应该可以正常工作(而不是PACKAGENAME,给它PACKAGE-DEB-FILE)。
奎克吉x德09年

3
这个答案是错误的。您必须先安装该软件包。如果没有安装,则没有.deb文件。
尼尔

此命令对我有用。例如,我从Google下载了google-chrome-stable_current_amd64.deb。然后发出命令:dpkg --contents google-chrome-stable_current_amd64.deb并且列出了将要安装的所有文件(主要是/opt/google/chrome),在我键入此文件时,这些文件当前都未安装在我的系统上。(如果需要的话,我正在运行Xubuntu 11.10。)
quux00 2012年

10
@Neil,答案是正确的。仅仅因为您有一个deb文件,并不意味着它已安装。apt-file需要整个build-essential包。OO
d -_- b

21

dpkg --contents让您查看已卸载的软件包。如果.deb尚未在您的系统上,请执行

apt-get --download-only install pkgname

该软件包将下载到/var/cache/apt/archives但未安装。


3
我可以只列出内容而不下载吗?如果我的连接速度很慢,并且软件包太大而无法下载。如果.deb文件具有目录列表所在的文件头,我想可能不需要下载整个程序包。这可能吗?
耶利(Jièjéléi),2009年

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安装)。
罗斯兰

8

我接受了@baldoz的http想法,并将其推广到Ubuntu和Debian,添加了一些内容sed并将其包装在bash函数一线式中:

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.comhttps://packages.debian.org
  2. lsb_Release -sc返回的代号(例如“ trusty”,“ sid”等)用于构建完整的URL: https://packages.ubuntu.com/trusty/all/curl/filelist
  3. 使用curl获取该URL,并通过三个sed命令将html传递给管道。首先只捕获文件列表(<pre></pre>标签之间的内容);第二个去除任何html标签;第三个删除任何空白行。

注意:它不会搜索PPA,备用apt源码库,而仅查询可用于您正在运行的debian / ubuntu发行版的官方软件包。


我需要运行红宝石吗?
Anwar

1
@Anwar,我最初使用Ruby是因为我很懒,并且多行正则表达式会吸收sed / awk / grep。但是我将其重写为使用两个sed命令,不需要Ruby。
notpeter

真好!这是我一直在寻找的答案
Anwar 2015年

4

对于所有仍可能在2017年1月谷歌搜索此问题的人,您可以在Debian 8.5中拥有一些很棒的apt和dpkg最新版本的东西,而无需下载任何内容。

列出Deb文件的内容而不下载:

首先找到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开关显示deb软件包的url,但未下载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软件包中提取文件,无需下载。
例如,我们要阅读yade软件包的手册页,而无需安装此软件包,甚至不下载deb软件包。

deb软件包中的手册页文件名dpkg -c./usr/share/man/man1/yade.1.gz

要即时阅读手册页:

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应用程序正确显示手册页。

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”命令的系统!
乔恩·瓦特

2

尝试:

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

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


您也可以在不下载软件包文件的情况下检查内容。

因此,如果您知道.deb文件的URL ,则以下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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.