如何通过 dpkg 找到已安装软件包的版本号?

Jor*_*tro 99 command-line dpkg

我使用该dpkg -l命令来找出我安装的软件包的版本。例如:

dpkg -l network-manager
Run Code Online (Sandbox Code Playgroud)

返回包的信息:

Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                      Version                   Description
+++-=========================-=========================-==================================================================
ii  network-manager           0.8.3~git.20101118t223039 network management framework daemon
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它返回0.8.3~git.20101118t223039哪个是错误的,因为它截断了版本(为了这个问题,我选择了一个很长的版本)。我过去解决这个问题的方法是传递一个愚蠢的长 COLUMNS 参数以使其扩展:

COLUMNS=200 dpkg -l network-manager
Run Code Online (Sandbox Code Playgroud)

这给了我整个版本号,还有一堆垃圾:

Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                         Version                                      Description
+++-============================================-============================================-========================================================================================================
ii  network-manager                              0.8.3~git.20101118t223039.d60a988-0ubuntu1   network management framework daemon
Run Code Online (Sandbox Code Playgroud)

现在我可以看到完整的版本号,即0.8.3~git.20101118t223039.d60a988-0ubuntu1.

我觉得这不是查找已安装软件包版本号的正确方法。这在过去从来都不是问题,但是随着版本中“ubuntu”的加入和 PPA 的激增,这些字符串变得越来越长。有更容易的方法吗?

ane*_*hep 92

dpkg -s <packagename> | grep '^Version:'
Run Code Online (Sandbox Code Playgroud)

例如:

dpkg -s network-manager | grep '^Version:'
Run Code Online (Sandbox Code Playgroud)

示例输出:

Version: 0.8.1+git.20100810t184654.ab580f4-0ubuntu2
Run Code Online (Sandbox Code Playgroud)

  • @Twisted Pear - `dpkg --info package.deb` 操作包文件,`dpkg -s &lt;packagename&gt;` 操作包名称 - 不需要文件 (3认同)

A T*_*A T 50

dpkg-query --showformat='${Version}' --show python3-lxml
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个版本,因为它很精确(不需要 grep 或 cut)。 (7认同)
  • 当查询多个包时,我建议:`dpkg-query --showformat='${Package}\t${Version}\n' --show lsb-release coreutils ...` (3认同)
  • 几乎肯定要打印换行符,否则这是类似于“printf”的行为。例如,`dpkg-query --showformat='${Version}\n' --show python3-lxml`。 (2认同)

Isa*_*iah 26

它不是使用dpkg命令而是使用apt-show-versions 安装女妖

例子:

$ apt-show-versions network-manager  
network-manager/maverick uptodate 0.8.1+git.20100810t184654.ab580f4-0ubuntu2
Run Code Online (Sandbox Code Playgroud)


and*_*ing 15

我认为 aneeshep 是最好的答案,因为您的问题指定使用 dpkg。但为了完整起见,这是另一种方式:

apt-cache policy network-manager 
network-manager:
  Installed: 0.8.1+git.20100810t184654.ab580f4-0ubuntu2
  Candidate: 0.8.1+git.20100810t184654.ab580f4-0ubuntu2
  Version table:
 *** 0.8.1+git.20100810t184654.ab580f4-0ubuntu2 0
        500 http://us.archive.ubuntu.com/ubuntu/ maverick/main i386 Packages
        100 /var/lib/dpkg/status
Run Code Online (Sandbox Code Playgroud)

或者只是版本号:

apt-cache policy network-manager | grep 'Installed:' | cut -c 14-
0.8.1+git.20100810t184654.ab580f4-0ubuntu2
Run Code Online (Sandbox Code Playgroud)


Avi*_*Raj 7

另一种通过dpkg如下方式查找已安装软件包版本的方法,

dpkg -l | awk '$2=="package-name" { print $3 }'  
Run Code Online (Sandbox Code Playgroud)

例子:

$ dpkg -l | awk '$2=="network-manager" { print $3 }'
0.9.8.0-0ubuntu22
Run Code Online (Sandbox Code Playgroud)

解释:

dpkg -l命令列出所有已安装的包。此标准输出作为awk命令的输入提供。awk在标准输入(第2 列)中搜索相应的包名称,如果找到则抓取相应的行。最后打印(第3 列)的值,它实际上代表了包版本。

$ dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
Run Code Online (Sandbox Code Playgroud)

根据上述,第 2 列表示包名称,第 3 列表示包版本,第 4 列表示架构,第 5 列表示包描述