¿Cómo puedo encontrar el número de versión de un paquete instalado a través de dpkg?

83

Uso el dpkg -lcomando para averiguar qué versión de un paquete he instalado. Por ejemplo:

dpkg -l network-manager

devuelve la información en el paquete:

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

Como puede ver, devuelve lo 0.8.3~git.20101118t223039que está mal porque trunca la versión (he elegido una larga para esta pregunta). La forma en que he resuelto esto en el pasado es pasar un argumento COLUMNAS estúpidamente largo para que se expanda:

COLUMNS=200 dpkg -l network-manager

que me da el número de versión completo, pero también un montón de basura:

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

Ahora puedo ver el número de versión completo, que es 0.8.3~git.20101118t223039.d60a988-0ubuntu1.

Tengo la sensación de que esta no es la forma correcta de encontrar el número de versión de un paquete instalado. Esto nunca fue realmente un problema en el pasado, pero con la incorporación de "ubuntu" en las versiones y la proliferación de PPA, estas cadenas son cada vez más largas. hay una manera mas facil?

Jorge Castro
fuente

Respuestas:

82
dpkg -s <packagename> | grep '^Version:'

p.ej:

dpkg -s network-manager | grep '^Version:'

Salida de muestra:

Version: 0.8.1+git.20100810t184654.ab580f4-0ubuntu2
aneeshep
fuente
dpkg --info package.debfunciona, aunque -sno funcionó
Twisted Pear
2
@Twisted Pear - dpkg --info package.debopera en archivos de paquete, dpkg -s <packagename>opera en nombres de paquete - no se requiere archivo
carril
37
dpkg-query --showformat='${Version}' --show python3-lxml
A
fuente
2
Al consultar varios paquetes, sugiero:dpkg-query --showformat='${Package}\t${Version}\n' --show lsb-release coreutils ...
ThorSummoner
66
Me gusta esta versión, ya que es precisa (no se necesita grep ni corte).
guettli
1
Es casi seguro que desea imprimir una nueva línea, de lo contrario, este es un comportamiento similar a "printf". Por ejemplo, dpkg-query --showformat='${Version}\n' --show python3-lxml.
Chris Lamb
25

No está usando el dpkgcomando sino apt-show-versiones Instalar banshee

Ejemplo:

$ apt-show-versions network-manager  
network-manager/maverick uptodate 0.8.1+git.20100810t184654.ab580f4-0ubuntu2
Isaias
fuente
15

Creo que aneeshep es la mejor respuesta, ya que su pregunta especifica el uso de dpkg. Pero para completar, aquí hay otra forma:

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

O solo por el número de versión:

apt-cache policy network-manager | grep 'Installed:' | cut -c 14-
0.8.1+git.20100810t184654.ab580f4-0ubuntu2
andrewsomething
fuente
1
La salida de apt-cachedepende de la configuración regional actual. Por ejemplo, en Alemania lo necesitas grep 'Installiert:'. Para compensar eso, use siempre Locale C.UTF-8cuando realice scripts. Ya sea LC_ALL=C.UTF-8; export LC_ALLal comienzo del guión o caso por caso, algo como:LC_ALL=C.UTF-8 apt-cache policy network-manager | grep 'Installed:' | awk '{print $2}'
Tino
5

Otro método para encontrar la versión de un paquete instalado de la dpkgsiguiente manera,

dpkg -l | awk '$2=="package-name" { print $3 }'  

Ejemplo:

$ dpkg -l | awk '$2=="network-manager" { print $3 }'
0.9.8.0-0ubuntu22

Explicación:

dpkg -lEl comando enumera todos los paquetes instalados. Esta salida estándar se introdujo como entrada al awkcomando. awkbusca el nombre del paquete correspondiente en la entrada estándar ( columna 2 ) si encuentra y luego toma la línea correspondiente. Y finalmente imprime el valor de ( columna 3 ) que en realidad representa la versión del paquete.

$ 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

De acuerdo con lo anterior, la columna 2 representa el nombre del paquete , la columna 3 representa la versión del paquete , la columna 4 representa la arquitectura y la columna 5 representa la descripción del paquete .

Avinash Raj
fuente
¿Por qué necesita enumerar todos los paquetes usando dpkgprimero y luego dejar que awk los filtre nuevamente? También puede solicitar el listado para un paquete único:dpkg -l <package-name>
gertvdijk