RPM查詢篇(轉)

post0發表於2007-08-09
RPM查詢篇(轉)[@more@]

RPM不僅在安裝,升級,解除安裝方面工作出色,而且在查詢方面比其它軟體包管理工具更勝一籌。這從以下幾種情況可以看出:

* 當你在瀏覽系統檔案時,發現一個檔案,想知道它來自哪個軟體包時,可以用RPM來查詢得知;

* 當你的朋友給你傳送來一個軟體包,但你不知道這是個什麼樣的軟體包,不知道它做些什麼,安裝些什麼,來源是哪裡。這時,你可以用RPM查詢搞定;

* 幾個月前你安裝了XFree86視窗軟體,但現在你忘了它的版本號,也不知它的說明文件在哪裡。這時,你可以用RPM查詢一下這個軟體包,得到這方面的資訊。

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

命令格式

查詢RPM格式的軟體包,可使用如下命令格式:

rpm -q [查詢選項1 查詢選項2...]

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

選項列表

選項詳解

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

指定用選項可分為如下幾類:

一、軟體包選擇類

此類選項在一次只能選擇一個,選擇多個時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),效果是喇叭鳴叫一聲。

: 輸出退格符(值為8),效果是刪除游標前面一個字元,且游標後退一個字元位置。

f : 輸出換頁符(值為12),根據終端解釋的不同,效果也不相同,有的是實現清屏操作,有的則是換一行。

: 輸出換行符(值為10),效果是游標移到下一行。

: 輸出回車符(值為13),效果是游標回到行首。

: 輸出跳格(值為9),根據終端解釋的不同,效果也不同,有的是輸出一個空格,有的 則輸出最多8個空格。

v : 輸出垂直方向的跳格(值為11),用處不大。

: 輸出反斜槓()這個字元。

* 功能標籤

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

%[輸出寬度]{功能標籤}

注:輸出寬度可選,正值表示右對齊輸出,負值表示左對齊輸出。

如格式串中使用%{NAME}時將輸出軟體名,使用%20{NAME}時則右對齊輸出軟體名,寬度為20,而使用%-20{NAME}時則按寬度為20左對齊輸出軟體名。看看下面的實際例子就會明白:

# rpm -q --qf "%{NAME}:%20{NAME}:%-20{NAME}: " file

file:file:file:

#

功能標籤書寫不區分大小寫,即NAME也可輸作name,Name等等。功能標籤還可以帶有選項,選項用":選項名"表示,選項名有大小寫之分。如% {FILEMODES}預設以數字形式輸出,如採用perms選項,即%{FILEMODES:perms},輸出結果將採用rwx的形式。請看下面的例子:

# rpm -q --qf "%{filenames} %{FILEMODES:perms} " file

/usr/bin/file -rwxr-xr-x-

#

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

RPM常用功能標籤表

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

* 陣列迴圈

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

下面的例子以陣列迴圈的方式,輸出file包所含的各個檔案的檔名及許可權,同時輸出每一個檔案時都要先輸出軟體包標識。

# rpm -q --qf "[%{=NAME}-%{=VERSION}-%{=RELEASE} : %-20{FILENAMES} : %{FILEMODES:perms} ]" 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} " | sort -nr +1 | head -1

kernel-source 65824967

#

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-939078/,如需轉載,請註明出處,否則將追究法律責任。

相關文章