怎样使用rpm命令一次性删除依赖的软件包

怎样使用rpm命令一次性删除依赖的软件包

搜索了一下网络,发现解法大体有两种:

第一种方法:不管依赖包

相互依赖的软件包,使用rpm的--nodeps参数就搞定了.
rpm --nodeps -e gdm-2.24.1-4.fc10.i386

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

也就是说不检查依赖。这样的话,那些使用该软件包的软件在此之后可能就不能正常工作了。

第二种方法:手工添加依赖包到命令行

执行

rpm -e 要删除的rpm包名称

然后根据输出再在命令行后面跟上依赖包名称

rpm -e 要删除的rpm包名称 依赖的rpm包名称

这种方法是我以前也经常使用的,比如用于删除RHEL/CentOS中原装的jdk

下面演示这一步骤,比较烦,因为要删除的依赖包实在太多,要复制粘贴n次

[root@localhost ~]#java -version

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.i386error: 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. do_once()
  3. {
  4. rpm-e"$@"2>&1|grep'(installed)'
  5. }
  6. for((I=1;I<=4;++I))
  7. do
  8. DEPS="$DEPS$(do_once"$@"$DEPS|awk'{print$8}')"
  9. echo$I$DEPS
  10. 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. do_once()
  3. {
  4. rpm-e"$@"2>&1|grep'(installed)'
  5. }
  6. for((I=1;I<=5;++I))
  7. do
  8. NEWDEPS="$(do_once"$@"$DEPS|awk'{print$6}')"
  9. DEPS="$DEPS$NEWDEPS"
  10. echo$I$NEWDEPS
  11. if[!"$NEWDEPS"];then
  12. break
  13. fi
  14. 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. do_once()
  3. {
  4. rpm-e"$@"
  5. rpm-e"$@"2>&1|grep'(installed)'
  6. }
  7. for((I=1;I<=5;++I))
  8. do
  9. #NEWDEPS="$(do_once"$@"$DEPS|awk'{print$6$8}')"
  10. NEWDEPS="$(do_once"$@"$DEPS|sed-e's/^.*(installed)//')"
  11. DEPS="$DEPS$NEWDEPS"
  12. echo$I$NEWDEPS
  13. if[!"$NEWDEPS"];then
  14. break
  15. fi
  16. 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]#

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题,总结出来的一套通用的解决方案。
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容易使用。
单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方式处理个别对象和对象组合。
装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候,所有依赖者都会自动收到通知。
代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
工厂模式(Factory Design Pattern)可细分为三种,分别是简单工厂,工厂方法和抽象工厂,它们都是为了更好的创建对象。
状态模式允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
命令模式将请求封装为对象,能够支持请求的排队执行、记录日志、撤销等功能。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 基本介绍 **意图:**在不破坏封装性的前提下,捕获一个对象的内部状态,并在该
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为
享元模式(Flyweight Pattern)(轻量级)(共享元素)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结