2009-12-14 06:49:35 +0000 2009-12-14 06:49:35 +0000
295
295

如何在没有安装的情况下列出Debian包的文件

这个命令只能列出已安装的包的内容,

dpkg -L PACKAGENAME

但如何列出未安装的包的内容,预览/检查包的内容?

答案 (8)

359
359
359
2009-12-14 15:42:54 +0000

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 资源库中的包的内容。是否安装任何特定的软件包都是无关紧要的。

58
58
58
2009-12-14 08:14:19 +0000

使用--contents代替-L

dpkg --contents PACKAGENAME

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

23
23
23
2009-12-14 14:34:45 +0000

dpkg --contents会让你查看未安装的软件包。如果.deb还不在你的系统中,请执行

apt-get --download-only install pkgname

,该包会被下载到/var/cache/apt/archives中,但不会安装。

15
15
15
2013-06-01 13:57:56 +0000

最好的方法是直接浏览包库:

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

示例:

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

8
8
8
2015-04-21 21:44:25 +0000

我把@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标签;第三个删除任何空白行。
5
5
5
2017-01-06 03:14:29 +0000

对于那些在2017年1月可能还在搜索这个问题的人来说,你可以在Debian 8.5中使用最新版本的apt和dpkg,而不需要下载任何东西,就可以得到一些很酷的东西。

然后显示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:同样的结果也可以用

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 ......................

**从上面的deb包中提取一个文件,不下载。 * 例如,我们想在不安装这个包,甚至不下载deb包的情况下读取yade包的man page。

2
2
2
2014-06-27 15:28:37 +0000

尝试:

apt-get download packages-name
dpkg --contents *.deb
1
1
1
2015-12-27 13:33:51 +0000

好像是先安装或者从.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文件的URL,下面的shell命令会列出所有的包文件:

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

Curl params:curl–沉默,dpkg --contents FILE–跟随移动链接。