歡迎您光臨本站 註冊首頁

LINUX之RPM查詢篇

←手機掃碼閱讀     火星人 @ 2014-03-24 , reply:0

RPM不僅在安裝,升級,卸載方面工作出色,而且在查詢方面比其它軟體包管理工具更勝一籌。這從以下幾種情況可以看出:
* 當你在瀏覽系統文件時,發現一個文件,想知道它來自哪個軟體包時,可以用RPM來查詢得知;
* 當你的朋友給你發送來一個軟體包,但你不知道這是個什麼樣的軟體包,不知道它做些什麼,安裝些什麼,來源是哪裡。這時,你可以用RPM查詢搞定;
* 幾個月前你安裝了XFree86窗口軟體,但現在你忘了它的版本號,也不知它的說明文檔在哪裡。這時,你可以用RPM查詢一下這個軟體包,得到這方面的信息。

RPM的查詢還有一個高級功能,即定製輸出功能。你可用--queryformat(或-qf)來定製一下輸出格式,這樣,RPM查詢得到的信息將以你定製的格式輸出,這樣很是方便,尤適合於程序的自動處理。

命令格式
查詢RPM格式的軟體包,可使用如下命令格式:
rpm -q [查詢選項1 查詢選項2...]


注: 也可使用--query代替-q,效果相同。

選項列表






選項詳解
指定用選項中ftp與http相關的四個選項(--ftpproxy,--ftpport,--httpproxy,--httpport)和通用選項的解釋,請參見<<精通RPM之二--安裝篇>>,本文不再贅述。下面對指定用選項做些解釋:

指定用選項可分為如下幾類:
一、軟體包選擇類
此類選項在一次只能選擇一個,選擇多個時RPM將提示錯誤:
rpm: one type of query/verify may be performed at a time

從查詢方面看,一個是查詢那些已安裝的軟體包,一個是查詢未安裝的軟體包。
1. 查詢已安裝的軟體包,使用下列選項:
(1) -a (或--all) : 查詢所有已安裝的軟體包
# rpm -q -a
setup-2.0.2-1
filesystem-1.3.4-5
basesystem-6.0-5
agrep-2.04-5
aktion-0.3.6-2
amor-0.5-1
dhcpcd-1.3.17pl2-1
ldconfig-1.9.5-15
glibc-2.1.2-12
chkconfig-1.0.6-2
......
#


注: 本例查找當前系統中安裝的所有軟體包,輸出很多,僅列出幾個,剩下的省略掉了(以......表示)。
(2) -g (或--group) : 查詢有哪些軟體包屬於指定類別
RPM根據軟體功用的不同,將軟體分為以下若干類:(括弧內為註釋)
Amusements/Games (娛樂/遊戲)
Amusements/Graphics(娛樂/圖形)
Applications/Archiving (應用/檔案)
Applications/Communications (應用/通訊)
Applications/Databases (應用/資料庫)
Applications/Editors (應用/編輯器)
Applications/Emulators (應用/模擬器)
Applications/Engineering (應用/工程)
Applications/File (應用/文件)
Applications/Internet (應用/網際網路)
Applications/Multimedia (應用/多媒體)
Applications/Productivity (應用/產品)
Applications/Publishing (應用/印刷)
Applications/System (應用/系統)
Applications/Text (應用/文本)
Development/Debuggers (開發/調試器)
Development/Languages (開發/語言)
Development/Libraries (開發/函數庫)
Development/System (開發/系統)
Development/Tools (開發/工具)
Documentation (說明文檔)
System Environment/Base (系統環境/基礎)
System Environment/Daemons (系統環境/守護)
System Environment/Kernel (系統環境/內核)
System Environment/Libraries (系統環境/函數庫)
System Environment/Shells (系統環境/介面)
User Interface/Desktops (用戶界面/桌面)
User Interface/X (用戶界面/X窗口)
User Interface/X Hardware Support (用戶界面/X硬體支持)
Other (其它)


注意: 類別是大小寫敏感的,這一點輸入時要小心。如果用戶想要查詢當前系統安裝了哪些遊戲類的軟體包,可這樣做:
# rpm -q -g Amusements/Games
clanbomber-1.01-1
kdegames-1.1.2-1
xbill-2.0-6
xboard-4.0.0-3
xboing-2.4-7
xgammon-0.98-14
xjewel-1.6-11
xpat2-1.04-10
xpilot-3.6.2-6
xpuzzles-5.4.1-7
xtrojka-1.2.3-6
#


如果用戶想查詢若干類別的軟體包時,可以把類別都列出來,一起查詢,如:
# rpm -q -g Applications/Editors Applications/File
emacs-20.3-15
emacs-nox-20.3-15
emacs-X11-20.3-15
vim-common-5.6-12
vim-minimal-5.6-12
vim-X11-5.6-12
fileutils-4.0-3
bzip2-0.9.5d-1
findutils-4.1-32
git-4.3.17-6
gzip-1.2.4-15
slocate-1.4-7
stat-1.5-12
file-3.26-6
#


注: 本例查詢結果中前6個為"應用/編輯器"類別,后8個為"應用/文件"類別。
(3) -f (或--file) : 查詢有哪些軟體包擁有指定文件這個選項非常有用。當用戶不清楚某個文件屬於哪個軟體包時,可試試這個選項。假如我記不清/usr/sbin/ftpd這個文件在哪個包中,現在用RPM查詢:
# rpm -qf /usr/sbin/ftpd
inet6-apps-0.36-3
#


現在知道了,它在inet6-apps-0.36-3包中。命令中-qf是-q -f的縮寫,當選項僅帶一個減號時,多個選項可以合併在一起,如-a -b -c三個選項可寫作-abc,執行效果相同。
(4) --whatrequires : 查詢有哪些包需要指定功能
本選項指示RPM從所有已安裝的軟體包中,查詢有哪些軟體包提供了用戶指定的功能,命令行上可輸入一個或多個功能。
# rpm -q --whatrequires /bin/ps libc.so.6 | head
autofs-3.1.3-2
agrep-2.04-5
aktion-0.3.6-2
amor-0.5-1
chkconfig-1.0.6-2
libtermcap-2.0.8-16
bash-2.03-10
ncurses-4.2-18
info-3.12f-4
fileutils-4.0-3
#


注: 本例從系統中查詢哪些軟體包需要/bin/ps和libc.so.6功能,通過管道輸出前10行內容。
(5) --whatprovides : 查詢有哪些包提供指定功能
本選項指示RPM從所有已安裝的軟體包中,查詢有哪些軟體包提供了用戶指定的功能。命令行上可輸入一個或多個功能。
# rpm -q --whatprovides libc.so.6 /bin/ps
glibc-2.1.2-12
no package provides /bin/ps
#


注: 本例從系統中查詢有哪些軟體包提供libc.so.6與/bin/ps功能,結果是glibc-2.1.2-12包提供了libc.so.6,而沒有包提供/bin/ps功能。
(6) --triggeredby : 查詢有哪些包被指定的包觸發本選項指示RPM從所有已安裝的軟體包中,查詢有哪些包可被用戶指定的包觸發。指定的包可輸入一個或多個。
# rpm -q --triggeredby file
foo-8.0-1
#


注: 本例查詢后得知,安裝或卸載foo-8.0-1包,將會觸發與file包相關的腳本程序執行。

2. 查詢未安裝的軟體包: (僅有一個選項可用)
(1) -p : 查詢指定包裹文件的信息
使用本選項,通過指定一個或多個包裹文件名,RPM就可以獲取相應包裹的有關信息。包裹文件可以是一般形式,也可是ftp/http形式。
# rpm -qp -l --ftpport 2121 ftp://zzz:pass@linux/zhsoft/file-3.26-6.i386.rpm
/usr/bin/file
/usr/man/man1/file.1
/usr/man/man4/magic.4
/usr/share/magic
#


注: 本例查詢ftp形式的包裹,顯示其文件列表(-l選項使然,下面要講到)。ftp用戶名zzz,密碼為pass,遠程機為linux,文件名為/zhsoft/file-3.26-6.i386.rpm,ftp使用2121埠。
二、信息顯示類
本類選項可同時選擇多個,以顯示多種信息。
1. -i : 顯示軟體包信息
當用戶需要了解軟體包的頭部信息時,要使用該選項。
# rpm -qi file
Name: file Relocations: /usr
Version : 3.26 Vendor: Red Hat Software
Release : 6 Build Date: 1999年03月23日 星期二 05時32分29秒
Install date: 2001年10月14日 星期日 21時18分25秒 Build Host: porky.devel.redhat.com
Group : Applications/File Source RPM: file-3.26-6.src.rpm
Size: 211946 License: distributable
Packager: Red Hat Software
Summary : A utility for determining file types.
Description :
The file command is used to identify a particular file according to the
type of data contained by the file. File can identify many different
file types, including ELF binaries, system libraries, RPM packages, and
different graphics formats.

You should install the file package, since the file command is such a
useful utility.
#


上述輸出中,包含多個域,各個域的含義為:
Name : 軟體名;Relocations : 重定位目錄前綴(一個或多個);
Version : 版本號;Vendor : 開發商;
Release : 釋出號;Build Date : 包建立時間;
Install date : 安裝時間; Build host : 包建立主機;
Group: 類別; Source RPM : 源代碼包;
Size : 大小; License : 許可證;
Packager : 打包者;
Summary : 軟體簡介;
Description : 詳細描述。


2. -l (或--list) : 顯示軟體包文件列表
當用戶想知道軟體包包含哪些文件時,要使用該選項。輸出時,一行一個文件名,形成文
件列表。下例列出file包中文件:
# rpm -qlv file
-rwxr-xr-x root root23948 3月 23 1999 /usr/bin/file
-rwxr-xr-x root root12023 3月 23 1999 /usr/man/man1/file.1
-rwxr-xr-x root root 6625 3月 23 1999 /usr/man/man4/magic.4
-rwxr-xr-x root root 169350 3月 23 1999 /usr/share/magic
#


注: 本例列文件時選用了通用選項-v,這樣列出的格式同ls命令列出的格式,從中可以看到各個文件的許可權,屬主,屬組,大小,最後修改時間及文件名等信息。

3. -d (或--docfiles) : 顯示軟體包說明文檔RPM將軟體包中的文件分為三類,一是配置文件,一是說明文檔,再一是其它文件(包括可執行程序及數據文件等)。通過-d選項,可列出包中所有說明文檔。下例列出file包中說明文檔:
# rpm -qd file
/usr/man/man1/file.1
/usr/man/man4/magic.4
#



4. -c (或--configfiles) : 顯示軟體包配置文件使用本選項可列出包中所有配置文件。下例列出lze包中的配置文件:
# rpm -qc lze
/etc/funkey.def
/etc/inputme.def
#



5. -s (或--state) : 顯示軟體包文件狀態RPM已安裝的軟體包中各個文件可擁有如下4種狀態:
* normal(正常): 這表明文件未被其它軟體包修改過。
* replaced(已替換): 這表明文件已被其它軟體包修改替換過了,不再是原先的文件了。* not installed(未安裝): 這表明文件未安裝。有一種原因可導致這種情況發生,這就是當安裝軟體包時使用了--excludedocs選項(或是通過設置%_excludedocs宏為1),說明文檔未被安裝到系統中。當用RPM查詢此軟體包狀態時,所有說明文檔均顯示此狀態。
* net shared(網路共享): 這表明文件處於網路共享狀態。這一狀態是RPM用來支持NFS(網路文件系統)的,用於避免一個NFS客戶端系統刪除一個正在共享的文件時,另一NFS客戶端系統無法正常使用含此文件的軟體包。有兩種情況可使文件在此狀態,一是文件安裝在真實網路共享的目錄里,二是文件安裝在RPM資源配置文件中%_netsharedpath宏所確定的目錄里。
# rpm -i --excludedocs file-3.26-6.i386.rpm
# rpm -qs file
normal/usr/bin/file
not installed /usr/man/man1/file.1
not installed /usr/man/man4/magic.4
normal/usr/share/magic
#


注: 本例先安裝file包裹文件,選用--excludedocs表明不安裝說明文檔。而後再查詢file包文件的狀態,可以看到其說明文檔均為not installed(未安裝),其它文件為normal(正常)狀態。

6. -R (或--requires) : 顯示軟體包所需的功能
所謂功能,可以是軟體包標識,可以是文件(如共享庫libc.so.6等),也可以是虛擬的名字。軟體包的依賴關係,就是依靠功能來實現的。RPM安裝軟體包時,如果所需功能不存在,則其依賴關係不滿足,RPM將中斷安裝過程。
# rpm -q -R lze
/bin/sh
ld-linux.so.2
libc.so.6
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
#


注: 本例查詢lze包所需的功能。

7. --provides : 顯示軟體包提供的功能
一個軟體包,可以提供若干功能,這些功能可以是動態鏈接庫等實際的文件,也可以是虛擬的名字(只要其它軟體包可以用就行了)。如果想查詢某個包提供了哪些功能,要用--provides
選項。
下面的例子查詢一個包裹文件所提供的功能:
# rpm -qp --provides zlib-1.1.3-6.i386.rpm
libz.so.1
libz.so.1(GCC.INTERNAL)
#


注: 本包裹文件提供的功能是libz.so.1動態鏈接庫。

8. --conflicts : 顯示軟體包衝突的功能
何謂衝突?衝突就是不同軟體包之間不能共存的現象。RPM製作軟體包時,可以記錄下與本軟體包不能共存的功能,這樣安裝該包時,若衝突的功能已然存在,則RPM將中止安裝。
下面的例子查詢at-3.1.7-8包是否有與其衝突的功能:
# rpm -q --conflicts at-3.1.7-8
crontabs <= 1.5
#


注: 本例顯示at包與版本號小於1.5的crontabs包有衝突存在。

9. --scripts : 顯示軟體包內置的腳本程序
scripts即腳本,指的是用SHELL語言編寫的程序。選用本選項時,RPM將輸出軟體包所含的各類腳本程序的內容。總共有5類這樣的腳本程序,即安裝前腳本程序(preinstall),安裝後腳本程序(postinstall),卸載前腳本程序(preuninstall),卸載後腳本程序(postuninstall)和校驗腳本程序(verify)。
下面的例子列出zsh包的腳本程序:

# rpm -q --scripts zsh-3.0.7-4 | nl
1 postinstall script (through /bin/sh):
2 if [ ! -f /etc/shells ] ; then
3 echo "/bin/zsh" > /etc/shells
4 else
5 echo "/bin/zsh" >> /etc/shells
6 fi
7 /sbin/install-info /usr/info/zsh.info.gz /usr/info/dir \
8 --entry="* zsh: (zsh). An enhanced bourne shell."
9 preuninstall script (through /bin/sh):
10 if [ "$1" = 0 ] ; then
11 /sbin/install-info --delete /usr/info/zsh.info.gz /usr/info/dir \
12 --entry="* zsh: (zsh). An enhanced bourne shell."
13 fi
14 postuninstall script (through /bin/sh):
15 if [ "$1" = 0 ] ; then
16 if [ -f /etc/shells ] ; then
17 TmpFile=`/bin/mktemp /tmp/.zshrpmXXXXXX`
18 grep -v '^/bin/zsh$' /etc/shells > $TmpFile
19 cp -f $TmpFile /etc/shells
20 rm -f $TmpFile
21 chmod 644 /etc/shells
22 fi
23 fi
#


注: 本例利用管道技術給查詢的每行輸出加上了行號,便於觀察解釋。
第2-8行: 為安裝後腳本程序(postinstall)的源代碼;
第10-13行: 為卸載前腳本程序(preuninstall)的源代碼;
第15-23行: 為卸載後腳本程序(postuninstall)的源代碼。
例中所有腳本程序均通過/bin/sh解釋執行,本例沒有安裝前腳本程序(preinstall)和
校驗腳本程序(verify)。

10. --triggers : 顯示軟體包內置的觸髮腳本程序
觸髮腳本程序是scripts類腳本程序的擴展,它用於軟體包之間的交互控制。觸髮腳本
程序有安裝時觸髮腳本程序(triggerin),卸載前觸髮腳本程序(triggerun)和卸載后觸髮腳
本程序(triggerpostun)三種。
下面的例子列出zsh包中的觸髮腳本程序:
# rpm -q --triggers zsh-3.0.7-4
triggerpostun script (through /bin/sh) -- zsh <= 3.0.7-2
if [ ! -f /etc/shells ] ; then
echo "/bin/zsh" > /etc/shells
else
echo "/bin/zsh" >> /etc/shells
fi
#


注: 輸出的第1行說明腳本程序的類別(為卸載后觸髮腳本程序triggerpostun),用什麼程序解釋(一般為/bin/sh),和觸發的條件(在--之後描述)。本例的觸發條件為zsh的版本小於或等於3.0.7-2。如果條件成立,則此腳本程序將會執行。 輸出的第2-6行為卸載后觸髮腳本程序的源代碼。

11. --changelog : 顯示軟體維護記錄
changelog即軟體維護記錄,用它來記錄什麼人,什麼時間,改動了軟體的什麼地方。通
過查看維護記錄,開發者或用戶可以了解軟體的開發進展情況。
下面的例子查詢lze包的維護情況:
# rpm -q --changelog lze-6.0-2
* 五 5月 01 1998 雨亦奇
- 增加多窗口操作
* 一 3月 24 1997 雨亦奇
- 增加塊操作命令
#


注: 從本例中就可以看出來,維護記錄的書寫有一定的規範:以星號(*)開頭的行記錄維護時間,維護人及其電子郵箱,而以減號(-)開頭的行則記錄維護的具體內容。

12. --dump : 顯示軟體包中所有文件的屬性信息
如果用戶想查看某個軟體包內文件的屬性信息,請用--dump選項。
# rpm -q --dump file
/usr/bin/file 23948 922138347 abaf6cfd51588ac7c484526fbdb84e5b 0100755 root root 0 0 0 X
/usr/man/man1/file.1 12023 922138346 76d9ff6567ab64a53eab50911272f5c1 0100755 root root 0 1 0 X
/usr/man/man4/magic.4 6625 922138346 b8d126803709f0da7f39f5125a132cd3 0100755root root 0 1 0 X
/usr/share/magic 169350 922138346 3bd2eaf3c5e0e84153ba7df38b7561fc 0100755 root root 0 0 0 X
#


現在根據例子的輸出,解釋一下RPM包中各個文件所擁有的屬性信息:(以第1行為例)
/usr/bin/file : 為文件名;
23948 : 指文件大小(位元組數);
922138347 : 指文件最後修改時間(秒數);
abaf6cfd51588ac7c484526fbdb84e5b : 指根據文件內容計算出的MD5檢查和;
0100755 : 指文件存取許可權;
root : 指文件屬主;
root : 指文件屬組;
0 : 配置文件標誌,為0表示該文件非配置文件,為1表明該文件是配置文件;
0 : 說明文檔標誌,為0表示該文件非說明文檔,為1表明該文件是說明文檔;
0 : 指文件類型,為0表示普通文件,非0表示設備文件,包含主從設備號;
X : 符號連接內容,如果文件不是符號連接,則此值為X。

三、定製輸出類
定製輸出是RPM一項強有力的功能,當用戶想要RPM按自己的格式輸出軟體包信息時,可以通過使用--qf(或--queryformat)選項來實現定製。

定製輸出要指定格式化的字元串(類似printf的格式串),該字元串以單引號'或雙引號"引住。格式串中可包括普通文本,含轉義符的文本,功能標籤和數組循環三種不同的組件。

* 普通文本
格式串中的普通文本將按原樣輸出。

* 含轉義符的文本
RPM定義的轉義符為\,稱作反斜杠。當RPM遇到此字元時,會根據預先定義的轉義序列,把後面的字元解釋后輸出。

轉義序列如下:
\a : 輸出響鈴字元(值為7),效果是喇叭鳴叫一聲。
\b : 輸出退格符(值為8),效果是刪除游標前面一個字元,且游標後退一個字元位置。
\f : 輸出換頁符(值為12),根據終端解釋的不同,效果也不相同,有的是實現清屏操作,有的則是換一行。
\n : 輸出換行符(值為10),效果是游標移到下一行。
\r : 輸出回車符(值為13),效果是游標回到行首。
\t : 輸出跳格(值為9),根據終端解釋的不同,效果也不同,有的是輸出一個空格,有的 則輸出最多8個空格。
\v : 輸出垂直方向的跳格(值為11),用處不大。
\\ : 輸出反斜杠(\)這個字元。


* 功能標籤
RPM內置了很多功能標籤,如NAME表示軟體名,VERSION表示版本號,RELEASE表示釋出號等。輸出功能標籤所表示的內容時,需用這樣一種格式:

%[輸出寬度]{功能標籤}
注:輸出寬度可選,正值表示右對齊輸出,負值表示左對齊輸出。
如格式串中使用%{NAME}時將輸出軟體名,使用%20{NAME}時則右對齊輸出軟體名,寬度為20,而使用%-20{NAME}時則按寬度為20左對齊輸出軟體名。看看下面的實際例子就會明白:
# rpm -q --qf "%{NAME}:%20{NAME}:%-20{NAME}:\n" file
file:file:file:
#


功能標籤書寫不區分大小寫,即NAME也可輸作name,Name等等。功能標籤還可以帶有選項,選項用":選項名"表示,選項名有大小寫之分。如%{FILEMODES}默認以數字形式輸出,如採用perms選項,即%{FILEMODES:perms},輸出結果將採用rwx的形式。請看下面的例子:
# rpm -q --qf "%{filenames} %{FILEMODES:perms}\n" file
/usr/bin/file -rwxr-xr-x-
#


注: %{filenames}表示包中的文件名。

RPM常用功能標籤表






注: 可用rpm --querytags命令查到RPM內置的所有功能標籤。

* 數組循環
對於功能標籤是數組的,可以用數組循環(用[與]括住的部分)來輸出數組的全部內容。數組循環內部可包含功能標籤,普通文本和含轉義符的文本。RPM將根據循環內部一個或多個數組類型的功能標籤所擁有的單元個數,取其最小值,循環同樣次數,輸出解釋或轉義后的數據。對於功能標籤僅含一個單元的,若想輸出多次,則需要在功能標籤前面加個等號(=)。

下面的例子以數組循環的方式,輸出file包所含的各個文件的文件名及許可權,同時輸出每一個文件時都要先輸出軟體包標識。
# rpm -q --qf "[%{=NAME}-%{=VERSION}-%{=RELEASE} : %-20{FILENAMES} : %{FILEMODES:perms}\n]" file
file-3.26-6 : /usr/bin/file : -rwxr-xr-x-
file-3.26-6 : /usr/man/man1/file.1 : -rwxr-xr-x-
file-3.26-6 : /usr/man/man4/magic.4 : -rwxr-xr-x-
file-3.26-6 : /usr/share/magic : -rwxr-xr-x-
#


通過使用定製輸出,我們可以很方便地查找出系統中佔用空間最大的軟體包。
# rpm -q -a --qf "%{NAME} %{SIZE}\n" | sort -nr +1 | head -1
kernel-source 65824967
#


注: -a項選擇所有已安裝的軟體包,--qf項定製查詢格式, 格式串中用功能標籤NAME輸出軟體名,用SIZE輸出軟體大小,查詢得到的數據通過管道送sort命令,對第2列降序排序後由head命令取第1行內容,這即是佔用空間最大的軟體包。

[火星人 ] LINUX之RPM查詢篇已經有615次圍觀

http://coctec.com/docs/linux/show-post-136576.html