ฉันจะค้นหาหมายเลขเวอร์ชันของแพ็คเกจที่ติดตั้งผ่าน dpkg ได้อย่างไร


83

ฉันใช้dpkg -lคำสั่งเพื่อค้นหาแพ็คเกจที่ฉันติดตั้งไว้ ตัวอย่างเช่น:

dpkg -l network-manager

ส่งคืนข้อมูลบนแพ็คเกจ:

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

อย่างที่คุณเห็นมันกลับมา0.8.3~git.20101118t223039ผิดเพราะมันตัดทอนเวอร์ชัน (ฉันเลือกอันที่ยาวเพื่อจุดประสงค์ของคำถามนี้) วิธีที่ฉันแก้ไขปัญหานี้ในอดีตคือการผ่านอาร์กิวเมนต์ COLUMNS ที่ยาวเหยียดเพื่อทำให้มันขยาย:

COLUMNS=200 dpkg -l network-manager

ซึ่งให้หมายเลขเวอร์ชั่นทั้งหมดกับฉัน แต่ยังมีขยะอีกด้วย:

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

0.8.3~git.20101118t223039.d60a988-0ubuntu1ตอนนี้ฉันสามารถดูจำนวนเวอร์ชันเต็มซึ่งเป็น

ฉันรู้สึกว่านี่ไม่ใช่วิธีที่เหมาะสมในการค้นหาหมายเลขเวอร์ชันของแพ็คเกจที่ติดตั้ง สิ่งนี้ไม่เคยเป็นปัญหาในอดีต แต่ด้วยการจัดการกับ "อูบุนตู" ในเวอร์ชั่นและการแพร่กระจายของ PPAs สตริงเหล่านี้เริ่มยาวขึ้นเรื่อย ๆ มีวิธีที่ง่ายกว่านี้ไหม?

คำตอบ:


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

เช่น:

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

ตัวอย่างผลลัพธ์:

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

dpkg --info package.debทำงานได้ดี แต่-sไม่ได้
Twisted Pear

2
@ Twisted Pear - dpkg --info package.debทำงานกับไฟล์แพ็กเกจdpkg -s <packagename>ทำงานกับชื่อแพ็กเกจ - ไม่ต้องการไฟล์
เลน

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

2
เมื่อสอบถามหลายแพ็คเกจฉันขอแนะนำ:dpkg-query --showformat='${Package}\t${Version}\n' --show lsb-release coreutils ...
ThorSummoner

6
ฉันชอบรุ่นนี้เนื่องจากมีความแม่นยำ (ไม่จำเป็นต้องใช้ grep หรือการตัด)
guettli

1
เกือบจะต้องการพิมพ์บรรทัดใหม่ไม่เช่นนั้นจะเป็นลักษณะการทำงาน "printf" ตัวอย่างเช่นdpkg-query --showformat='${Version}\n' --show python3-lxml.
Chris Lamb


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

หรือเพียงแค่หมายเลขรุ่น:

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

1
ผลลัพธ์ของapt-cacheขึ้นอยู่กับตำแหน่งที่ตั้งปัจจุบัน grep 'Installiert:'ยกตัวอย่างเช่นในประเทศเยอรมนีที่คุณจำเป็นต้อง เพื่อชดเชยสิ่งนั้นให้ใช้ Locale ทุกC.UTF-8ครั้งเมื่อสคริปต์ ทั้งLC_ALL=C.UTF-8; export LC_ALLในช่วงเริ่มต้นของสคริปต์หรือเป็นกรณี ๆ ไปเช่น:LC_ALL=C.UTF-8 apt-cache policy network-manager | grep 'Installed:' | awk '{print $2}'
Tino

5

อีกวิธีในการค้นหาเวอร์ชั่นของแพ็คเกจที่ติดตั้งผ่านทางdpkgด้านล่าง

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

ตัวอย่าง:

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

คำอธิบาย:

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

ตามที่กล่าวข้างต้นคอลัมน์ 2 หมายถึงชื่อแพคเกจคอลัมน์ 3 หมายถึงแพคเกจรุ่นคอลัมน์ 4 หมายถึงสถาปัตยกรรมและคอลัมน์ 5 แสดงให้เห็นถึงรายละเอียดแพคเกจ


ทำไมคุณต้องแสดงรายการแพ็คเกจทั้งหมดโดยใช้dpkgครั้งแรกแล้วปล่อยให้ awk กรองอีกครั้ง คุณสามารถขอรายชื่อสำหรับแพ็คเกจเดียวได้เช่นกัน:dpkg -l <package-name>
gertvdijk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.