Làm cách nào để tìm số phiên bản của gói đã cài đặt qua dpkg?


83

Tôi sử dụng dpkg -llệnh để tìm ra phiên bản của gói tôi đã cài đặt. Ví dụ:

dpkg -l network-manager

trả về thông tin trên bao bì:

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

Như bạn có thể thấy, nó trả về 0.8.3~git.20101118t223039cái sai vì nó cắt ngắn phiên bản (Tôi đã chọn một bản dài cho mục đích của câu hỏi này). Cách tôi đã giải quyết điều này trong quá khứ là vượt qua một đối số CỘT dài ngu ngốc để làm cho nó mở rộng:

COLUMNS=200 dpkg -l network-manager

cung cấp cho tôi toàn bộ số phiên bản, nhưng cũng có một đống rác:

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

Bây giờ tôi có thể thấy số phiên bản đầy đủ, đó là 0.8.3~git.20101118t223039.d60a988-0ubuntu1.

Tôi có cảm giác rằng đây không phải là cách thích hợp để tìm số phiên bản của gói đã cài đặt. Điều này chưa bao giờ thực sự là một vấn đề trong quá khứ, nhưng với việc xử lý "ubfox" trong các phiên bản và sự phổ biến của PPAs, các chuỗi này ngày càng dài hơn. Có cách nào dễ hơn không?

Câu trả lời:


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

ví dụ:

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

Đầu ra mẫu:

Version: 0.8.1+git.20100810t184654.ab580f4-0ubuntu2

dpkg --info package.debhoạt động, mặc dù -skhông
Twisted Pear

2
@Twisted Pear - dpkg --info package.debhoạt động trên các tệp gói, dpkg -s <packagename>hoạt động theo tên gói - không yêu cầu tệp
làn đường

37
dpkg-query --showformat='${Version}' --show python3-lxml

2
Khi truy vấn nhiều gói tôi đề nghị:dpkg-query --showformat='${Package}\t${Version}\n' --show lsb-release coreutils ...
ThorSummoner

6
Tôi thích phiên bản này, vì nó chính xác (không phải grep hoặc cắt cần thiết).
guettli

1
Hầu như chắc chắn muốn in một dòng mới, nếu không đây là hành vi giống như "printf". Ví dụ , dpkg-query --showformat='${Version}\n' --show python3-lxml.
Chris Lamb

25

Nó không sử dụng dpkglệnh mà là phiên bản apt-show Cài đặt banshee

Thí dụ:

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

15

Tôi nghĩ rằng aneeshep là câu trả lời tốt nhất vì câu hỏi của bạn chỉ định sử dụng dpkg. Nhưng để hoàn thiện hơn, đây là một cách khác:

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

Hoặc chỉ cho số phiên bản:

apt-cache policy network-manager | grep 'Installed:' | cut -c 14-
0.8.1+git.20100810t184654.ab580f4-0ubuntu2

1
Đầu ra của apt-cachephụ thuộc vào Địa điểm hiện tại. Ví dụ ở Đức bạn cần grep 'Installiert:'. Để bù đắp cho điều đó, luôn luôn sử dụng Locale C.UTF-8khi viết kịch bản. Hoặc LC_ALL=C.UTF-8; export LC_ALLlà khi bắt đầu kịch bản hoặc cho từng trường hợp cụ thể như:LC_ALL=C.UTF-8 apt-cache policy network-manager | grep 'Installed:' | awk '{print $2}'
Tino

5

Một phương pháp khác để tìm phiên bản của gói đã cài đặt thông qua dpkgnhư bên dưới,

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

Thí dụ:

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

Giải trình:

dpkg -llệnh liệt kê tất cả các gói đã cài đặt. Đầu ra tiêu chuẩn này được cung cấp làm đầu vào cho awklệnh. awktìm kiếm tên gói tương ứng trong đầu vào tiêu chuẩn ( cột 2 ) nếu tìm thấy thì nó lấy dòng tương ứng. Và cuối cùng in giá trị của ( cột 3 ) thực sự đại diện cho phiên bản gói.

$ 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

Theo như trên, cột 2 đại diện cho tên gói , cột 3 đại diện cho phiên bản gói , cột 4 đại diện cho kiến trúc và cột 5 đại diện cho mô tả gói .


Tại sao bạn cần liệt kê tất cả các gói bằng cách sử dụng dpkgtrước và sau đó để awk lọc lại chúng? Bạn cũng có thể yêu cầu danh sách cho một gói duy nhất:dpkg -l <package-name>
gertvdijk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.