若是你想要在你的系統上安裝、卸載或升級軟件,但殊不知道在你的系統中已經有哪些軟件了,這是否是一件很蛋疼的事?你可能會陷入下面這些場景中:html
這些場景不勝枚舉,可是你能夠用rpm -q幫助你。微信
當你瞭解瞭如何查詢軟件的信息後,很容易你就能敲出一個查詢命令來查詢你想要知道的信息。-q是一個最基本的選項,查詢可分爲對包的查詢以及對特定信息的查詢,下面看看針對包的查詢:ide
首先你要知道你要查詢的是哪個或那些包。ui
包名片是標識一個包的惟一字符串,每一個名片包含了三種信息:spa
當使用一個包的名片來查詢包的信息時,必須有包名,你也能夠加上版本號和發行號。第一個限制是,包名片的三種信息的每個都必須徹底給出,若是要寫上版本號,就須把版本號寫全,若是要寫上發行號,就須把發行號寫全。若是隻給出了三種信息的其中一個或兩個,那麼RPM在找包的時候就會省略右邊的其它部分。第二個限制是,若是你指定了發行號,那麼必須也要指定版本號。讓咱們以幾個例子來講明:code
假設,你最近安裝了一個新版本的C庫,可是你不記得版本號了:orm
# rpm -q libc libc-5.2.18-1
這樣的查詢方式中,rpm會從已安裝的軟件中找到匹配你給出的信息的軟件,並會把整個包名片都打印出來。在上面的例子中,假設系統也安裝有版本爲5.2.17的C庫,那它也會顯示出來。htm
下面的例子中,咱們將會把版本號也包括進去查詢:crontab
# rpm -q rpm-2.3 rpm-2.3-1
注意,RPM對包名是比較挑剔的,例如,下面這些查詢就查不到C庫:ip
# rpm -q LibC package LibC is not installed # rpm -q lib package lib is not installed # rpm -q "lib*" package lib* is not installed # rpm -q libc-5 package libc-5 is not installed # rpm -q libc-5.2.1 package libc-5.2.1 is not installed
正如你能看到的,RPM對於包名是大小寫敏感的,而且不接受沒有寫全的包名、版本號和發行號。並且它也不能使用通配符。可是從上面咱們能夠看到,給出包名片的一部分信息依然是能找到該包的,rpm -q libc-5.2.18和rpm -q libc-5.2.18-1都能正確地找到包libc-5.2.18-1。
僅僅根據包名片來查詢,顯得有點寒酸。畢竟有的時候,你須要知道一個包的名字後才能去查詢它的信息。不過,還有其餘方式能夠指定特定的包...
使用-a選項能查詢到在你係統上安裝好的全部包:
# rpm -qa ElectricFence-2.0.5-2 ImageMagick-3.7-2 … tetex-xtexsh-0.3.3-8 lout-3.06-4
其實-a的輸出可能會有不少,所以上面省略了不少包。你可使用more或者grep重定向輸出。
多少次你坐在你的電腦前看着一個程序,然而並不知道它是幹嗎用的。若是這個程序是使用RPM安裝的包所安裝的一部分程序,那麼很容易用RPM來獲得你想要的答案。只要使用-f選項。例如,你找到一個陌生的程序叫作/bin/ls(好吧,大多數人對ls不陌生),想要知道是哪一個包安裝了它嗎?很簡單:
# rpm -qf /bin/ls fileutils-3.12-3
若是你指定的文件並非使用安裝包安裝的:
# rpm -qf .cshrc file /home/ed/.cshrc is not owned by any package
上述中,若是你獲得了"not owned by any package",其實並不表明文件不是一個安裝包安裝的:
# rpm -qf /usr/X11/bin/xterm file /usr/X11/bin/xterm is not owned by any package
經過上面的消息,咱們很容易認爲xterm不是任何一個包所安裝的。
可是,讓咱們去它的目錄下看看:
# ls -lF /usr … lrwxrwxrwx 1 root root 5 May 13 12:46 X11 -> X11R6/ drwxrwxr-x 7 root root 1024 Mar 21 00:21 X11R6/ …
關鍵的地方就是這個X11 -> X11R6/,這是一個符號連接,但RPM不認帳,它只認X11,而無論X11R6。
怎麼辦,有兩種方法:
不要使用符號連接來查詢,這一般很難作到。不過能夠經過namei命令來追蹤連接的真實文件地址
# namei /usr/X11/bin/xterm f: /usr/X11/bin/xterm d / d usr l X11 -> X11R6 d X11R6 d bin - xterm
很顯然,上面命令的輸出結果中很容易看出X11到X11R6的符號連接,因此你可使用真實的文件地址來獲取信息:
# rpm -qf /usr/X11R6/bin/xterm XFree86-3.1.2-5
直接切換到你所要查詢文件的目錄下,即便是個符號連接,也能帶你到真實的路徑下:
XFree86-3.1.2-5
當你遇到"not owned by any package" 時, 若是你心生懷疑,那麼就試試上面兩種方法吧。
到目前爲止,每一個爲RPM查詢指定安裝包的方法都側重於那些已經被安裝好的包。-p選項就是用來查詢那些還沒安裝到你係統的中的包的。
若是你須要瞭解一個包中的信息,但這個包的名字已經被改變過了。雖然包的名字改變過了,可是包的內容尚未改變過。咱們查詢的信息來源主要是從包裏來。這時咱們能夠經過這個選項來找到這個包中到底包含了哪些內容:
# rpm -qp foo.bar rpm-2.3-1
只須要一個命令,RPM就能給你想要的答案。
-p選項也能使用URL來指定包。
-p選項還能夠從標準輸入中查詢包的信息,例如:
# cat bother-3.5-1.i386.rpm | rpm -qp - bother-3.5-1
把cat的輸出管道定向到RPM,最後一個-告訴RPM從標準輸入中讀取。
當包的建立者在建立包時,須要對包進行分類,以把功能類似的包分類到一塊兒。RPM可以經過分組來查詢包,例如,有一個分組名叫Base,這個分組的包都提供了比較底層的Linux功能,咱們能夠看看這個分組有哪些包組成:
# rpm -qg Base setup-1.5-1 pamconfig-0.50-5 filesystem-1.2-1 crontabs-1.3-1 dev-2.3-1 etcskel-1.1-1 initscripts-2.73-1 mailcap-1.0-3 pam-0.50-17 passwd-0.50-2 redhat-release-4.0-1 rootfiles-1.3-1 termcap-9.12.6-5
不過要注意的是分組名是大小寫敏感的。rpm -qg base將不會查詢到任何信息。
RPM對包之間的依賴提供了不少支持,一個包可能依賴於另外一包所提供的功能。
--whatprovides選項就是用來作這種事的,選項後面跟上一個功能,RPM就會查詢到具備該功能的全部包,例如:
# rpm -q --whatprovides module-info kernel-2.0.18-5
在這裏,只有kernel-2.0.18-5提供了module-info的功能。
--whatrequires選項與上面的--whatprovides選項在邏輯上是對立的,用這個選項能找出須要依賴於特定功能的全部包,下面是一個例子:
# rpm -q --whatrequires module-info kernelcfg-0.3-2
能夠看到惟一須要module-info功能的包是kernelcfg-0.3-2
指定好包後,你可能須要指出你須要查找這個包的哪方面的信息,正如咱們已經看到的,默認狀況下,使用rpm -q只會返回包名片,可是包的信息可不止這些哦。接下來咱們會查看全部咱們能查找到的信息:
在rpm -q上加上-i選項將會給出包的詳細信息 :
# rpm -qi rpm Name : rpm Distribution: Red Hat Linux Vanderbilt Version : 2.3 Vendor: Red Hat Software Release : 1 Build Date: Tue Dec 24 09:07:59 1996 Install date: Thu Dec 26 23:01:51 1996 Build Host: porky.redhat.com Group : Utilities/System Source RPM: rpm-2.3-1.src.rpm Size : 631157 Summary : Red Hat Package Manager Description : RPM is a powerful package manager, which can be used to build, install, query, verify, update, and uninstall individual software packages. A package consists of an archive of files, and package information, including name, version, and description.
上面各項信息的意義以下所示:
經過加上-l選項能查找出安裝包安裝的全部文件:
# rpm -ql adduser /usr/sbin/adduser
因爲adduser只安裝了一個文件,因此只有一個文件被列出來。