怎樣使用rpm命令一次性刪除依賴的軟件包

怎樣使用rpm命令一次性刪除依賴的軟件包

搜索了一下網絡,發現解法大致有兩種: java

第一種方法:無論依賴包

相互依賴的軟件包,使用rpm的--nodeps參數就搞定了.
rpm --nodeps -e gdm-2.24.1-4.fc10.i386 node

man rpm 寫道
       --nodeps
              Don’t check dependencies before uninstalling the packages.

也就是說不檢查依賴。這樣的話,那些使用該軟件包的軟件在此以後可能就不能正常工做了。 sql

 

第二種方法:手工添加依賴包到命令行

執行 編程

    rpm -e 要刪除的rpm包名稱 api

而後根據輸出再在命令行後面跟上依賴包名稱 tomcat

    rpm -e 要刪除的rpm包名稱 依賴的rpm包名稱 網絡

這種方法是我之前也常常使用的,好比用於刪除RHEL/CentOS中原裝的jdk jvm

 

下面演示這一步驟,比較煩,由於要刪除的依賴包實在太多,要複製粘貼n次 jsp

[root@localhost ~]# java -version ui

java version "1.6.0_22" OpenJDK Runtime Environment (IcedTea6 1.10.4) (rhel-1.24.1.10.4.el5-i386) OpenJDK Server VM (build 20.0-b11, mixed mode)

[root@localhost ~]# rpm -qa | grep jdk

java-1.6.0-openjdk-1.6.0.0-1.24.1.10.4.el5 java-1.6.0-openjdk-devel-1.6.0.0-1.24.1.10.4.el5

[root@localhost ~]# rpm -e java-1.6.0-openjdk-1.6.0.0-1.24.1.10.4.el5 java-1.6.0-openjdk-devel-1.6.0.0-1.24.1.10.4.el5

error: Failed dependencies: jre >= 1.5.0 is needed by (installed) openoffice.org-ure-3.1.1-19.5.el5_5.6.i386

[root@localhost ~]# rpm -e java-1.6.0-openjdk-1.6.0.0-1.24.1.10.4.el5 java-1.6.0-openjdk-devel-1.6.0.0-1.24.1.10.4.el5 openoffice.org-ure-3.1.1-19.5.el5_5.6.i386 error: Failed dependencies: libjvmaccessgcc3.so.3 is needed by (installed) openoffice.org-core-3.1.1-19.5.el5_5.6.i386 libjvmaccessgcc3.so.3(UDK_3.1) is needed by (installed) openoffice.org-core-3.1.1-19.5.el5_5.6.i386

太多輸出,省略

  by (installed) openoffice.org-calc-3.1.1-19.5.el5_5.6.i386 openoffice.org-ure = 1:3.1.1-19.5.el5_5.6 is needed by (installed) openoffice.org-graphicfilter-3.1.1-19.5.el5_5.6.i386 openoffice.org-ure = 1:3.1.1-19.5.el5_5.6 is needed by (installed) openoffice.org-draw-3.1.1-19.5.el5_5.6.i386

[root@localhost ~]# 有太多軟件包須要刪除,此處再也不繼續

[root@localhost ~]#

 

 

第三種方法:用腳本(固然:有可能寫腳本比複製粘貼更難,前者是智力活,後者是體力活)

編寫一個 force_remove_package.sh 的Bash腳本,內容以下:

 

Bash代碼   收藏代碼
  1. #!/bin/sh  
  2.   
  3. do_once()  
  4. {  
  5.         rpm -e "$@" 2>&1 | grep '(installed)'  
  6. }  
  7.   
  8. for ((I=1; I<=4; ++I))  
  9. do  
  10.         DEPS="$DEPS $(do_once "$@" $DEPS | awk '{print $8}')"  
  11.         echo $I $DEPS  
  12. done  

 

其中,

1. 用 for 循環進行有限次嘗試 而不用 while true,那是爲了防止編程死循環,別由於輸入錯誤真的把系統裏面全部的包都給刪除了;

2. awk命令裏面的 $8,是通過嘗試出來的,由於 rpm -e 命令輸出的信息中包含有不少空格;

3. rpm -e 的錯誤輸出須要重定向到標準輸出,不然就不會獲得依賴包,而直接輸出在終端上了。

 

 

用它來刪除系統原裝的jdk,輸出以下:

[root@localhost setup]# ./force_remove_package.sh java-1.6.0-openjdk-1.6.0.0-1.24.1.10.4.el5 java-1.6.0-openjdk-devel-1.6.0.0-1.24.1.10.4.el5 
1 openoffice.org-ure-3.1.1-19.5.el5_5.6.i386
2 openoffice.org-ure-3.1.1-19.5.el5_5.6.i386 openoffice.org-core-3.1.1-19.5.el5_5.6.i386 openoffice.org-writer-3.1.1-19.5.el5_5.6.i386 openoffice.org-impress-3.1.1-19.5.el5_5.6.i386 openoffice.org-math-3.1.1-19.5.el5_5.6.i386 openoffice.org-calc-3.1.1-19.5.el5_5.6.i386 openoffice.org-graphicfilter-3.1.1-19.5.el5_5.6.i386 openoffice.org-draw-3.1.1-19.5.el5_5.6.i386
3 openoffice.org-ure-3.1.1-19.5.el5_5.6.i386 openoffice.org-core-3.1.1-19.5.el5_5.6.i386 openoffice.org-writer-3.1.1-19.5.el5_5.6.i386 openoffice.org-impress-3.1.1-19.5.el5_5.6.i386 openoffice.org-math-3.1.1-19.5.el5_5.6.i386 openoffice.org-calc-3.1.1-19.5.el5_5.6.i386 openoffice.org-graphicfilter-3.1.1-19.5.el5_5.6.i386 openoffice.org-draw-3.1.1-19.5.el5_5.6.i386 openoffice.org-xsltfilter-3.1.1-19.5.el5_5.6.i386 openoffice.org-langpack-zh_TW-3.1.1-19.5.el5_5.6.i386 openoffice.org-langpack-zh_CN-3.1.1-19.5.el5_5.6.i386
4 openoffice.org-ure-3.1.1-19.5.el5_5.6.i386 openoffice.org-core-3.1.1-19.5.el5_5.6.i386 openoffice.org-writer-3.1.1-19.5.el5_5.6.i386 openoffice.org-impress-3.1.1-19.5.el5_5.6.i386 openoffice.org-math-3.1.1-19.5.el5_5.6.i386 openoffice.org-calc-3.1.1-19.5.el5_5.6.i386 openoffice.org-graphicfilter-3.1.1-19.5.el5_5.6.i386 openoffice.org-draw-3.1.1-19.5.el5_5.6.i386 openoffice.org-xsltfilter-3.1.1-19.5.el5_5.6.i386 openoffice.org-langpack-zh_TW-3.1.1-19.5.el5_5.6.i386 openoffice.org-langpack-zh_CN-3.1.1-19.5.el5_5.6.i386
[root@localhost setup]#

 

固然,還能夠繼續改進,以下:

Bash代碼   收藏代碼
  1. #!/bin/sh  
  2.   
  3. do_once()  
  4. {  
  5.         rpm -e "$@" 2>&1 | grep '(installed)'  
  6. }  
  7.   
  8. for ((I=1; I<=5; ++I))  
  9. do  
  10.         NEWDEPS="$(do_once "$@" $DEPS | awk '{print $6}')"  
  11.         DEPS="$DEPS $NEWDEPS"  
  12.         echo $I $NEWDEPS  
  13.         if [ ! "$NEWDEPS" ]; then  
  14.                 break  
  15.         fi  
  16. done  
 

這個改進主要是,

1. 對每次檢查時新增的依賴包進行檢查,若是沒有新增的依賴包($NEWDEPS),程序中止運行;

2. awk 輸出的 $8 也變成了 $6。其中原因如今尚未找到。

 

用它來刪除tomcat試試。

[root@localhost setup]# rpm -qa | grep tomcat 
tomcat5-servlet-2.4-api-5.5.23-0jpp.22.el5_7
tomcat5-jsp-2.0-api-5.5.23-0jpp.22.el5_7

[root@localhost setup]# ./force_remove_package.sh tomcat5-servlet-2.4-api-5.5.23-0jpp.22.el5_7 tomcat5-jsp-2.0-api-5.5.23-0jpp.22.el5_7 
1 hsqldb-1.8.0.9-1jpp.2.i386 bsf-2.3.0-11jpp.1.i386 bsf-2.3.0-11jpp.1.i386
2 bsh-1.3.0-9jpp.1.i386
3
[root@localhost setup]# rpm -qa | grep tomcat       
[root@localhost setup]#

 

發現上面改進過的腳本仍是有問題的,在刪除帶有java的軟件包時會有問題

改用sed而不是awk

Bash代碼   收藏代碼
  1. #!/bin/sh  
  2.   
  3. do_once()  
  4. {  
  5.         rpm -e "$@"  
  6.         rpm -e "$@" 2>&1 | grep '(installed)'  
  7. }  
  8.   
  9. for ((I=1; I<=5; ++I))  
  10. do  
  11.         #NEWDEPS="$(do_once "$@" $DEPS | awk '{print $6 $8}')"  
  12.         NEWDEPS="$(do_once "$@" $DEPS | sed -e 's/^.*(installed)//')"  
  13.         DEPS="$DEPS $NEWDEPS"  
  14.         echo $I $NEWDEPS  
  15.         if [ ! "$NEWDEPS" ]; then  
  16.                 break  
  17.         fi  
  18. done  

 

使用sed替換能準確的取得依賴的軟件包名稱。

 

[root@localhost setup]# rpm -qa | grep java 
java-1.4.2-gcj-compat-1.4.2.0-40jpp.115
tzdata-java-2011l-4.el5
[root@localhost setup]#

[root@localhost setup]# ./force_remove_package.sh java-1.4.2-gcj-compat-1.4.2.0-40jpp.115 tzdata-java-2011l-4.el5  1 xml-commons-apis-1.3.02-0.b2.7jpp.10.i386 xerces-j2-2.7.1-7jpp.2.el5_4.2.i386 xalan-j2-2.7.0-6jpp.1.i386 xml-commons-resolver-1.1-1jpp.12.i386 gjdoc-0.7.7-12.el5.i386 antlr-2.7.6-4jpp.2.i386 lucene-1.4.3-1jpp.16.i386 2 [root@localhost setup]# rpm -qa | grep java [root@localhost setup]#

相關文章
相關標籤/搜索