![为什么我在 /usr/share/doc 中看到的包数量和使用 dpkg -l 命令时看到的包数量不同?](https://linux22.com/image/1542885/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E5%9C%A8%20%2Fusr%2Fshare%2Fdoc%20%E4%B8%AD%E7%9C%8B%E5%88%B0%E7%9A%84%E5%8C%85%E6%95%B0%E9%87%8F%E5%92%8C%E4%BD%BF%E7%94%A8%20dpkg%20-l%20%E5%91%BD%E4%BB%A4%E6%97%B6%E7%9C%8B%E5%88%B0%E7%9A%84%E5%8C%85%E6%95%B0%E9%87%8F%E4%B8%8D%E5%90%8C%EF%BC%9F.png)
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 -h
和ls /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-manager
或HTML
各种 KDE 包的名称。
答案2
造成这种情况的常见原因有两个:
- 并非所有软件包都包含实际数据。有些是所谓的“元软件包”,仅由依赖项列表组成(大多数桌面环境的主要软件包就是很好的例子)。有些是“虚拟”软件包,它们的存在是为了提供一种依赖特定服务的简单方法,而无需关心使用哪种实现(Debian 上的“init”软件包就是这样一个例子)。Debian 还有“过渡虚拟软件包”,它们的存在是为了确保在升级期间依赖项仍能正确解析(因为 dpkg 本身无法重命名已安装的软件包)。
- 您可能有一些软件包被删除了,但系统中仍有配置文件。
dpkg
您给出的命令仍会将这些软件包与已安装的软件包一起列出,但它们几乎永远不会在 下有目录/usr/share/doc
。