精通 RPM 之查询篇
文章目錄
- 一、命令格式
- 二、選項詳解
- (一)查詢所有已安裝的軟件包
- (二)查詢有哪些軟件包屬于指定的類別
- (三)查詢有哪些軟件包擁有指定文件
- (四)查詢有哪些包需要指定功能
- (五)查詢有哪些軟件包提供了指定的功能
- (六)查詢有哪些包被指定的包觸發
- (七)查詢指定包裹文件的信息
- (八)顯示軟件包信息
- (九) 顯示軟件包文件列表
- (十)顯示軟件包說明文檔
- (十一)顯示軟件包的所有配置文件
- (十二)顯示軟件包中的文件狀態
- (十三)顯示軟件包所需的功能(即依賴對象)
- (十四)顯示軟件包提供的功能
- (十五)顯示與指定的軟件包有沖突的功能
- (十六)顯示軟件包內置的腳本程序
- (十七)顯示軟件包內置的觸發腳本程序
- (十八)顯示軟件的維護記錄
- (十九)顯示軟件包中所有文件的屬性信息
- (二十)按指定的格式輸出內容,即定制輸出格式
- 1. 普通文本
- 2. 含轉義符的文本
- 3. 功能標簽
- 4. 數組循環
RPM 不僅在安裝、升級、卸載方面工作出色,而且在查詢方面比其它軟件包管理工具更勝一籌。這從以下幾種情況可以看出:
當你在瀏覽系統文件時,發現一個文件,想知道它來自哪個軟件包時,可以用 RPM 來查詢得知;
當你的朋友給你發送來一個軟件包,但你不知道這是個什么樣的軟件包,不知道它做些什么,安裝些什么,來源是哪里。這時,你可以用RPM查詢搞定;
幾個月前你安裝了 XFree86 窗口軟件,但現在你忘了它的版本號,也不知它的說明文檔在哪里。這時,你可以用 RPM 查詢一下這個軟件包,得到這方面的信息。
RPM 的查詢還有一個高級功能,即定制輸出功能。你可用選項 --queryformat 或 -qf 自定義輸出格式,這樣,RPM 查詢得到的信息將以你定制的格式輸出,這樣很是方便,尤適合于程序的自動處理。
一、命令格式
查詢 RPM 格式的軟件包,可使用如下命令格式:
rpm -q [查詢選項1 查詢選項2...]注: 也可使用 --query 代替 -q,效果相同。
二、選項詳解
(一)查詢所有已安裝的軟件包
使用選項 -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 ...... #注: 本例查找當前系統中安裝的所有軟件包,輸出很多,僅列出幾個,剩下的省略掉了(以…表示)。
(二)查詢有哪些軟件包屬于指定的類別
使用選項 -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個為"應用/文件"類別。
(三)查詢有哪些軟件包擁有指定文件
可以使用選項 -f 或 --file 查詢有哪些軟件包擁有指定文件,這個選項非常有用。當用戶不清楚某個文件屬于哪個軟件包時,可試試這個選項。假如我記不清 /usr/sbin/ftpd 這個文件在哪個包中,現在用 RPM 查詢:
# rpm -qf /usr/sbin/ftpd inet6-apps-0.36-3 #(四)查詢有哪些包需要指定功能
哪些包需要指定的功能,其實是指哪些包需要依賴于指定的功能。
選項 --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 行內容。
(五)查詢有哪些軟件包提供了指定的功能
選項 --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 功能。
(六)查詢有哪些包被指定的包觸發
--triggeredby 選項指示 RPM 從所有已安裝的軟件包中,查詢有哪些包可被指定的包觸發。指定的包可輸入一個或多個:
# rpm -q --triggeredby file foo-8.0-1 #注: 本例查詢后得知,file 依賴于 foo-8.0-1 包,所以安裝 file 會觸發 foo-8.0-1 相關的腳本程序執行。
(七)查詢指定包裹文件的信息
使用選項 -p 指定一個或多個包裹文件名,RPM 就可以獲取相應包裹的有關信息。包裹文件可以是一般形式,也可是 ftp/http 形式。
例如,查詢 ftp 服務器中的軟件包 file-3.26-6.i386.rpm 的文件列表:
# 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 形式的包裹,顯示其文件列表。ftp 用戶名 zzz,密碼為 pass,遠程主機名為 linux,文件名為 /zhsoft/file-3.26-6.i386.rpm,ftp 使用 2121 端口。
(八)顯示軟件包信息
選項 -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 : 詳細描述。
(九) 顯示軟件包文件列表
使用選項 -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 -l 的輸出格式相同,從中可以看到各個文件的權限,屬主,屬組,大小,最后修改時間及文件名等信息。
(十)顯示軟件包說明文檔
RPM 將軟件包中的文件分為三類:一是配置文件;二是說明文檔;三是其它文件(包括可執行程序及數據文件等)。通過選項 -d 或 --docfiles 可以顯示(列出)軟件包的所有說明文檔。
例如,列出 file 包中的說明文檔:
# rpm -qd file /usr/man/man1/file.1 /usr/man/man4/magic.4 #(十一)顯示軟件包的所有配置文件
使用選項 -c 或 --configfiles 可列出包中所有的配置文件。
例如,列出 lze 包中的配置文件:
# rpm -qc lze /etc/funkey.def /etc/inputme.def #(十二)顯示軟件包中的文件狀態
使用選項 -s 或 --state 可以顯示軟件包文件狀態。已安裝的 RPM 軟件包中各個文件可擁有如下4種狀態:
注: 本例先安裝file包裹文件,選用–excludedocs表明不安裝說明文檔。而后再查詢file包文件的狀態,可以看到其說明文檔均為not installed(未安裝),其它文件為normal(正常)狀態。
(十三)顯示軟件包所需的功能(即依賴對象)
軟件包所需要的功能,就是軟件包需要的依賴對象,軟件包依賴于這些對象才能正常運行。使用選項 -R 或者 --requires 可以列出軟件包所需要的功能。
所謂功能,可以是軟件包標識,可以是文件(如共享庫 libc.so.6 等),也可以是虛擬的名字。軟件包的依賴關系,就是依靠功能來實現的。RPM 安裝軟件包時,如果所需功能不存在,則其依賴關系不滿足,RPM 將中斷安裝過程。
例如,查看軟件包 lze 所需要的依賴對象有哪些呢:
# 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 包所需的功能,也就是說環境中若缺失其中任何一項,軟件包 lze 都無法成功安裝。
(十四)顯示軟件包提供的功能
一個軟件包,可以提供若干功能,這些功能可以是動態鏈接庫等實際的文件,也可以是虛擬的名字(只要其它軟件包可以用就行了)。如果想查詢某個包提供了哪些功能,可以使用選項 --provides。
例如,查詢一個包裹文件所提供的功能:
# rpm -qp --provides zlib-1.1.3-6.i386.rpm libz.so.1 libz.so.1(GCC.INTERNAL) #注: 本包裹文件提供的功能是 libz.so.1 動態鏈接庫。
(十五)顯示與指定的軟件包有沖突的功能
何謂沖突?沖突就是不同軟件包之間不能共存的現象。RPM 制作軟件包時,可以記錄下與本軟件包不能共存的功能,這樣安裝該包時,若沖突的功能已然存在,則 RPM 將中止安裝。使用選項 --conflicts 可以顯示出與指定的軟件包存在沖突的功能。
例如,查看與軟件包 at-3.1.7-8 有沖突的功能:
# rpm -q --conflicts at-3.1.7-8 crontabs <= 1.5 #注:本例顯示包 at-3.1.7-8 與版本號小于等于1.5 的 crontabs 包存在沖突。
(十六)顯示軟件包內置的腳本程序
scripts 即腳本,指的是用 SHELL 語言編寫的程序。使用選項 --scripts 可以指示 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)。
(十七)顯示軟件包內置的觸發腳本程序
使用選項 --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行為卸載后觸發腳本程序的源代碼。
(十八)顯示軟件的維護記錄
使用選項 --changelog 查看軟件的維護日志,日志記錄了什么人,什么時間,改動了什么。
例如,查詢 lze 包的維護情況:
# rpm -q --changelog lze-6.0-2 * 五 5月 01 1998 雨亦奇 - 增加多窗口操作 * 一 3月 24 1997 雨亦奇 - 增加塊操作命令 #注: 從本例中就可以看出來,維護記錄的書寫有一定的規范:以星號(*)開頭的行記錄維護時間,維護人及其電子郵箱,而以減號(-)開頭的行則記錄維護的具體內容。
(十九)顯示軟件包中所有文件的屬性信息
如果想查看某個軟件包內文件的屬性信息,請用 --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 的格式串),該字符串以單引號 ' 或雙引號 " 引住。格式串中可包括普通文本,含轉義符的文本,功能標簽和數組循環三種不同的組件。
1. 普通文本
格式串中的普通文本將按原樣輸出。
2. 含轉義符的文本
RPM定義的轉義符為 \,稱作反斜杠。當 RPM 遇到此字符時,會根據預先定義的轉義序列,把后面的字符解釋后輸出。
轉義序列如下:
\a:輸出響鈴字符(值為7),效果是喇叭鳴叫一聲。 \b:輸出退格符(值為8),效果是刪除光標前面一個字符,且光標后退一個字符位置。 \f:輸出換頁符(值為12),根據終端解釋的不同,效果也不相同,有的是實現清屏操作,有的則是換一行。 \n:輸出換行符(值為10),效果是光標移到下一行。 \r:輸出回車符(值為13),效果是光標回到行首。 \t:輸出跳格(值為9),根據終端解釋的不同,效果也不同,有的是輸出一個空格,有的則輸出最多8個空格。 \v:輸出垂直方向的跳格(值為11),用處不大。 \\:輸出反斜杠(\)這個字符。3. 功能標簽
RPM 內置了很多功能標簽(可用 rpm --querytags 命令查到 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} 表示包中的文件名。
4. 數組循環
對于功能標簽是數組的,可以用數組循環(用 [ 與 ] 括住的部分)來輸出數組的全部內容。數組循環內部可包含功能標簽、普通文本和含轉義符的文本。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 行內容,這即是占用空間最大的軟件包。
總結
以上是生活随笔為你收集整理的精通 RPM 之查询篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实际价格比备案价格高,高出部分可以要求返
- 下一篇: linux复制文件文件不全(linux