如何列出 .deb 文件中的软件包?

如何列出 .deb 文件中的软件包?
sudo dpkg --install some_stuff_all.deb

安装文件中的软件包some_stuff_all.deb

sudo dpkg --remove some_stuff_all.deb

显示消息:

dpkg: error: you must specify packages by their own names, not by quoting the names of the files they come in
...
Type dpkg-deb --help for help about manipulating *.deb files;

然后列出各个文件:

dpkg-deb  --contents  some_stuff_all.deb

如何列出.deb文件中的包?

答案1

要获取有关包文件的信息:

dpkg -I some_stuff_all.deb

这为您提供有关该文件的所有可用信息,包括包:、版本:、依赖项:、说明:等。

请参阅dpkg --help参考资料 选项摘要和man dpkg详细信息。请注意,这-I实际上是一个dpkg-deb选项,但当您为其提供选项时,它会为您dpkg运行。见且也。dpkg-debdpkg-debdpkg-deb --helpman dpkg-deb

答案2

一个文件中只有一个包.deb

如果命名了包文件example_1.234.deb,则该包也被命名example(至少通常是这样。理论上有人可以重命名该文件。)

如果你想使用 dpkg 删除一个包,你必须使用

dpkg --remove example并不是dpkg --remove example_1.234.deb

因为您要删除已安装的软件包,而不是软件包文件。

答案3

假设您的包被命名为,您可以使用以下选项foo.deb提取包的实际名称(以及 输出中列出的所有其他字段dpkg-deb -I foo.deb):dpkg-deb-f

dpkg-deb -f foo.deb Package
  • -f foo.deb PackagePackage:从包中提取字段foo.deb
user@user-X550CL ~/tmp % ls -l
totale 46316
-rw-rw-r-- 1 user user 47425034 ott  5 05:55 foo.deb
user@user-X550CL ~/tmp % dpkg-deb -f foo.deb Package                      
google-chrome-stable

dpkg-deb -f foo.deb Package扩展此功能,您可以使用在命令内运行的命令替换直接删除有问题的包dpkg -r

sudo dpkg -r $(dpkg-deb -f foo.deb Package)

答案4

如果您不在基于 Debian 的系统上并且无法访问这些dpkg工具,您仍然可以提取信息,因为deb文件使用开放格式。它们本质上是ar包含几个压缩tar档案的档案,其中一个包含control.tar一个文件,其中包含control有关包的所有元数据(dpkg -I返回的内容(本身调用dpkg-deb -I以获取信息))。

当前可以control.tar使用gzip或进行压缩xz

libarchivebsdtar支持所有这些存档格式(artar.gztar.xz),因此您可以执行以下操作:

bsdtar xOf file.deb 'control.tar*' |
  bsdtar xOf - ./control |
  grep -Pom1 '^Package: \K.*'

第一个在标准输出上bsdtar提取control.tar文件以提供给第二个bsdtar提取./control成员。grep(这里假设 GNU grep)提取包名称。

相关内容