为什么我在 /usr/share/doc 中看到的包数量和使用 dpkg -l 命令时看到的包数量不同?

为什么我在 /usr/share/doc 中看到的包数量和使用 dpkg -l 命令时看到的包数量不同?
user@host:~$ dpkg -l | tail -n +6 | wc -l
1212
user@host:~$ ls /usr/share/doc/ | wc -l
1148

我的目标是收集所有已安装软件包的许可证信息。使用dpkg -l命令得到 1212 条记录,但我只看到 下的 1148 个目录/usr/share/doc/。如何解释这种差异?

答案1

有一种方法可以解决这个问题:比较。

deltik@node51 [~]$ dpkg -l | tail -n +6 | wc -l
3170
deltik@node51 [~]$ ls /usr/share/doc/ | wc -l
2964

每一行的dpkg -l | tail -n +6格式如下:

ii  zram-config                                                 0.5                                                      all          Upstart job to enable zram support

每一行的ls /usr/share/doc/格式如下:

zram-config

为了使命令相互匹配,它们必须看起来像dpkg -l | tail -n +6 | awk '{print $2}' | sort -hls /usr/share/doc/ | sort -h

现在将输出放入两个文件中:

deltik@node51 [~]$ dpkg -l | tail -n +6 | awk '{print $2}' | sort -h > /tmp/a.txt
deltik@node51 [~]$ ls /usr/share/doc/ | sort -h > /tmp/b.txt

并区分它们(colordiff用于更容易查看):

colordiff /tmp/{a,b}.txt

在我的系统上,我看到了这些模式:

  • 如果您有两种不同的架构,您将看到/usr/share/doc/仅显示基础包而没有添加架构:

    305,308c305,306
    < gcc-5-base:amd64
    < gcc-5-base:i386
    < gcc-6-base:amd64
    < gcc-6-base:i386
    ---
    > gcc-5-base
    > gcc-6-base
    

    i386这解释了我的多架构(和amd64)系统上的大部分差异。

  • 如果忽略dpkg -l命令 ( dpkg -l | tail -n +6 | awk '{print $2}' | awk -F":" '{print $1}' | sort -h | uniq > /tmp/a.txt) 中的不同架构,您会看到某些包中没有放入任何内容/usr/share/doc/,例如以 开头的包linux-image

  • 或者其中有一个不同的文件夹名称/usr/share/doc/,例如包NetworkManager名称network-managerHTML各种 KDE 包的名称。

答案2

造成这种情况的常见原因有两个:

  1. 并非所有软件包都包含实际数据。有些是所谓的“元软件包”,仅由依赖项列表组成(大多数桌面环境的主要软件包就是很好的例子)。有些是“虚拟”软件包,它们的存在是为了提供一种依赖特定服务的简单方法,而无需关心使用哪种实现(Debian 上的“init”软件包就是这样一个例子)。Debian 还有“过渡虚拟软件包”,它们的存在是为了确保在升级期间依赖项仍能正确解析(因为 dpkg 本身无法重命名已安装的软件包)。
  2. 您可能有一些软件包被删除了,但系统中仍有配置文件。dpkg您给出的命令仍会将这些软件包与已安装的软件包一起列出,但它们几乎永远不会在 下有目录/usr/share/doc

相关内容