如何检查deb软件包的依赖列表

如何检查deb软件包的依赖列表。我正在运行Ubuntu 11.10,并且我已经备份了var/cache/apt/archives中的所有deb软件包。我想要格式化我的电脑,并仅重新安装选定的应用程序。还有什么方法可以获取已安装软件包和其依赖关系的列表。


1关于您的第二个问题,请参考http://askubuntu.com/questions/17823/how-to-list-all-installed-packages。 - htorque
要获取已安装软件包的完整列表,请使用 dpkg --get-selections | sed -n 's/[[:space:]]install$//p' - Tino
8个回答

这将向您展示有关包裹的所有信息:
dpkg -I package.deb

别忘了在软件包名之前加上/var/cache/apt/archives/,并使用制表符自动补全来找到完整的软件包名及其版本,例如dpkg -I /var/cache/apt/archives/elasticsearch_2.4.4_all.deb - Jason R. Coombs
1我没有看到任何依赖信息。 - Nick
你可以补充说明,该软件包可以在不重新安装的情况下获取(这可能是一个常见的使用场景),只需使用sudo apt-get install --reinstall --download-only [软件包名称]命令即可。 - Kalle Richter
请注意,这个命令(或者像其他地方报告的那样使用dpkg-deb)只会列出软件包自报的依赖关系。它并不能保证如果你安装了所有列出的依赖项,就能拥有使软件包正常运行所需的一切。软件包(尤其是第三方软件包)通常假设某些基本系统组件已经存在,而这些组件并没有在它们的依赖关系中列出。 - user46053
2这在我的Ubuntu 19.04上完美运行。 - Étienne
就让我告诉你,-I 是指 --info。请参阅 http://manpages.ubuntu.com/manpages/trusty/man1/dpkg.1.html。 - leoly

除了使用dpkg方法外,您还可以检查存储库中软件包的依赖关系。
apt-cache depends package-name

编辑 根据@Tino的建议进行了更新。@Tigran的评论不再适用。


depends VS rdepends

  • apt-cache depends package-name
    //显示package-name依赖于哪些软件包

  • apt-cache rdepends package-name
    //显示依赖于package-name的软件包

depends

$ apt-cache depends vim-runtime
vim-runtime
  Breaks: vim-tiny
 |Recommends: vim
    vim-athena
    vim-gtk
    vim-gtk3
    vim-nox
 |Recommends: vim-gtk
 |Recommends: vim-gtk3
 |Recommends: vim-athena
 |Recommends: vim-nox
  Recommends: vim-tiny
  Enhances: vim-tiny

rdepends

$ apt-cache rdepends vim-runtime
vim-runtime
Reverse Depends:
  vim
  vim
  vim-nox
  vim-gtk
  vim-athena
  vim-gtk3
  vim
  vim-nox
  vim-gtk
  vim-athena
  vim-gtk3

4注意:只有在已安装了软件包的情况下才能运行此功能。 - Tigran Saluev
2请注意,dpkg -I package 只适用于已安装的软件包。在执行 apt-get update 后,apt-cache 可以用于所有已知的软件包。 - Tino
1apt-cache depends package是一个更好的方式,因为showpkg无法告诉我们依赖关系是否是推荐、冲突等,所以有点令人困惑。如果需要结合dependsshowpkg的脚本,请参考https://unix.stackexchange.com/a/362866/23450。 - Tino
apt-cache depends 只作用于你的源中候选包,而不是你已安装的特定包版本。如果你的 apt 仓库支持多个版本,这可能会令人困惑。在这种情况下,apt-cache depends package-name=VERSION 似乎是唯一的选择。 - Will S
dpkg -I 命令适用于从另一台计算机上复制的 deb 文件(实际上是在 apt 安装失败后)。 - Martian2020

对于14.04及更高版本:

dpkg不再具有-I选项,您需要使用dpkg-deb来显示包括依赖关系在内的软件包信息:

dpkg-deb -I package.deb

2在Ubuntu 19.04上,我的dpkg确实有一个选项“-I”(版本1.19.6)。 - Étienne
我的 dpkg(v1.21.1)在 Ubuntu Jammy 22.04 上具有 -I - Amandasaurus

我知道这个问题很老,但是它是有可能的。我也不得不在StackOverflow/AskUbuntu上挖掘所有的内容。
这只显示了第一个软件包中的依赖关系,而不是全部。
脚本方法中可能会有一些重复,但你可以通过这样做来过滤它们:
COMMAND | tr " " "\n" | sort | uniq -d | xargs 

以下是方法:
在脚本中使用。
dpkg-deb -I <The .deb> | grep -E "Depends|Recommends|Suggests|Pre\-Depends" | tr -d "|," | sed "s/([^)]*)/()/g" | tr -d "()" | tr " " "\n" | grep -Ev "Depends|Recommends|Suggests|Pre\-Depends" | xargs

在一个脚本中,但没有下载(远程)
apt-cache show <The package name> | grep -E "Depends|Recommends|Suggests|Pre\-Depends" | tr -d "|," | sed "s/([^)]*)/()/g" | tr -d "()" | tr " " "\n" | grep -Ev "Depends|Recommends|Suggests|Pre\-Depends" | xargs

易于理解

dpkg-deb -I <The .deb> | grep -E --color=none "Depends|Recommends|Suggests|Pre\-Depends"

易于理解的(远程)

apt-cache show <The package name> | grep -E --color=none "Depends|Recommends|Suggests|Pre\-Depends"

获取依赖项的数量
dpkg-deb -I <The .deb> | grep -E "Depends|Recommends|Suggests|Pre\-Depends" | tr -d "|," | sed "s/([^)]*)/()/g" | tr -d "()" | tr " " "\n" | grep -Ev "Depends|Recommends|Suggests|Pre\-Depends" | xargs | tr " " "\n" | wc -l

获取依赖项数量(远程)
apt-cache show <The package name> | grep -E "Depends|Recommends|Suggests|Pre\-Depends" | tr -d "|," | sed "s/([^)]*)/()/g" | tr -d "()" | tr " " "\n" | grep -Ev "Depends|Recommends|Suggests|Pre\-Depends" | xargs | tr " " "\n" | wc -l

你可能想要将那些长的命令用\分开以提高可读性,但这取决于你。 - user986805
使用dpkg-deb --showformat命令可以大大简化命令,例如:dpkg-deb --show --showformat='${Depends} ${Recommends} ${Suggests} ${Pre-Depends}\n' bash_5.1-2_amd64.deb | sed -r 's/ \([^()]*\),?//g' - user986805
这似乎不起作用,要么我不明白我在看什么。如果我运行 apt depends curl,我会得到 libc6libcurlzlib1g。如果我运行 apt depends libc6,我会得到 libgcc-s1libcyrpt1。但是如果我使用您的脚本,这些第二层依赖关系就不会出现。(Ubuntu 20.04) - gman
@gman 它在 Xubuntu 20.04.2 LTS 上运行良好。 - Ganesha Sharma

apt-cache depends [Package-Name] 也可以使用。但是如果你从源列表之外的地方获取 .deb 包,那么像 apt-cache showpkg [Package-Name] && apt-cache depends [Package-Name] 这样的命令可能会显示过时的信息,或者与实际安装的软件包不同步,此时最好使用 dpkg -I [Package-Name]



如果您有未安装的软件包(通常是从存储库之外手动下载的),您需要使用dpkg。以下命令将显示软件包信息的摘要,包括其依赖关系:
dpkg --info [package name]

如果软件包已经安装在您的计算机上(来自存储库或手动下载),或者尚未安装但在存储库中可用,您可以使用apt。以下命令将仅显示其依赖项列表。
apt depends [package name]

这里是一些粗糙的、可能不够全面的后处理方法,可以对dpkg -I的输出进行处理,以获取依赖项列表:
计算机压缩版
# dpkg -I package.deb | python -c "import sys, re; t=re.split(r'\n(?= ?[\w]+:)|:', sys.stdin.read()); print '\n'.join([i.strip() for i in {key.strip(): value.strip() for key, value in zip(t[::2], t[1::2])}['Depends'].split(',')])"
#

为人类扩展:

dpkg -I package.deb | python -c "
    import sys, re;
    # Split keys and values into pairs (zipped together later)
    t=re.split(
        r'\n(?= ?[\w]+:)|:', 
        sys.stdin.read()
    ); 
    # Newline separate each dependency
    print '\n'.join([
        # Trim each dependency value
        i.strip() for i in {
            # Build assoc array from package metadata
            key.strip(): value.strip() 
            for key, value in zip(t[::2], t[1::2])
        }['Depends'].split(',')
    ])
"

这将回显依赖于'foo.deb'且尚未安装的软件包:dpkg -I foo.deb | for i in $(awk -F', ' '/Depends: /{gsub(/: /, ", "); for (i=2; i<=NF; i++) { gsub(/ .*$/, "", $(i)); printf("%s\n", $(i)); } }'); do dpkg -s $i &> /dev/null || echo $i; done | tr '\n' ' ' - Gregory Burd
@GregoryBurd,随意编辑我的回答/帖子,我将其发布为社区共享文档的原因就是如此^u^ - ThorSummoner
当我在elasticsearch上运行此命令时,它会发出libc6\nadduser\n Installed-Size\n。也就是说,它似乎匹配的不仅仅是Depends行。 - Jason R. Coombs