`

怎样使用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.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脚本,内容如下:

 

#!/bin/sh

do_once()
{
        rpm -e "$@" 2>&1 | grep '(installed)'
}

for ((I=1; I<=4; ++I))
do
        DEPS="$DEPS $(do_once "$@" $DEPS | awk '{print $8}')"
        echo $I $DEPS
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]#

 

当然,还可以继续改进,如下:

#!/bin/sh

do_once()
{
        rpm -e "$@" 2>&1 | grep '(installed)'
}

for ((I=1; I<=5; ++I))
do
        NEWDEPS="$(do_once "$@" $DEPS | awk '{print $6}')"
        DEPS="$DEPS $NEWDEPS"
        echo $I $NEWDEPS
        if [ ! "$NEWDEPS" ]; then
                break
        fi
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

#!/bin/sh

do_once()
{
        rpm -e "$@"
        rpm -e "$@" 2>&1 | grep '(installed)'
}

for ((I=1; I<=5; ++I))
do
        #NEWDEPS="$(do_once "$@" $DEPS | awk '{print $6 $8}')"
        NEWDEPS="$(do_once "$@" $DEPS | sed -e 's/^.*(installed)//')"
        DEPS="$DEPS $NEWDEPS"
        echo $I $NEWDEPS
        if [ ! "$NEWDEPS" ]; then
                break
        fi
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]#

 

 

3
3
分享到:
评论

相关推荐

    Ubuntu下使用rpm 软件包

    ### Ubuntu下使用rpm软件包 在Linux环境中,不同的发行版采用了不同的软件包管理系统来处理软件的安装、更新和卸载等操作。Ubuntu主要使用的软件包格式是`.deb`,而另一些基于Red Hat的发行版(如Fedora、CentOS等...

    精通rpm,rpm命令的使用

    - **批量安装**:使用`rpm -i *.rpm`命令可以一次性安装多个软件包。 - **软件包升级**:通过`rpm -Uvh &lt;new_package.rpm&gt;`命令可以升级现有的软件包。 - **查询已安装软件包的信息**:利用`rpm -qa`命令可以列出...

    gcc g++完整依赖rpm包

    在RPM包中,这些依赖项将以特定版本和适当的配置打包在一起,便于一次性安装。安装这些依赖包通常通过命令行执行,如`yum install`或`dnf install`(取决于你的Linux发行版)。 一旦这些依赖项安装完毕,就可以继续...

    本地安装gcc-c++依赖rpm

    标题中的“本地安装gcc-c++依赖rpm”指的是在Linux系统中,通过本地已经下载好的RPM(Red Hat Package Manager)包来安装GCC-C++编译器及其所有必需的...这样可以确保一次性安装成功,避免因为缺失依赖而导致的错误。

    gcc-c++ 及所需依赖 rpm安装包

    3. **安装依赖**:如果缺少依赖,可以逐个安装,或者使用`yum install &lt;dependency_package&gt;`(对于CentOS 6.x及更早版本)或`dnf install &lt;dependency_package&gt;`(对于CentOS 7.x及以上版本)一次性解决所有依赖。...

    Linux软件包管理器.pdf

    yum提供了基于网络的管理方式,能够自动解决软件包之间的依赖关系,并且可以一次性安装所有依赖的软件包。yum的基本命令包括“yum install [软件包名]”用于安装软件包,以及“yum remove [软件包名]”用于卸载...

    ntp-4.2.6p5-12.el6.centos.2.x86_64.r和ntpdate-4.2.6p5-12.el6.centos.2.x86_64.rpm

    ntpdate-4.2.6p5-12.el6.centos.2.x86_64.rpm 包含了一个命令行工具`ntpdate`,它可以一次性地校准系统时钟,而不是持续运行的服务。这通常在系统启动时或者需要快速校准时钟时使用,例如在没有网络连接时手动更新...

    redhat7-yum-rpm完整包.rar

    `*.rpm`是通配符,它会匹配当前目录下所有的RPM文件,从而一次性安装所有包。 安装YUM和相关RPM包后,系统将能够处理软件包的依赖关系,这使得在没有在线更新的情况下也能安装其他RPM软件。例如,你可以使用`yum ...

    createrepo安装依赖包

    这个压缩包文件包含的是`createrepo`安装所需的依赖包,通过进入包目录并执行`rpm -ivh *`命令,可以一次性安装所有必要的依赖,以便后续安装和使用`createrepo`。 首先,让我们深入了解一下`createrepo`的基本概念...

    ntp 离线安装包 RPM ntpdate离线安装

    `ntpdate-4.2.6p5-18.el7.centos.x86_64.rpm` 是一个单独的命令行工具,它不启动NTP服务,而是仅用于一次性调整系统时钟。在没有运行NTP服务的情况下,如果你需要快速与外部服务器对时,可以使用这个工具。 `...

    lrzsz-0.12.20-36.el7.x86_64.rpm

    离线安装的lrzsz-0.12.20-36.el7.x86_64.rpm软件包适合在无网络或网络条件不佳的环境中使用,安装过程只需通过RPM命令即可完成。尽管存在安全性上的局限,但在许多日常的系统维护和管理任务中,lrzsz仍然是一个非常...

    一些Linux包依赖讲解

    解决环形依赖通常需要一次性安装所有相关的软件包,可以使用`rpm -ivh`命令将所有包一起安装。 3. **模型依赖**:这种情况涉及到某个软件包需要系统中其他软件包的特定文件,比如库文件。解决方法是找到包含这些...

    mkfontscale及依赖包.zip

    总的来说,"mkfontscale及依赖包.zip" 提供了一个方便的方法来一次性解决mkfontscale工具及其依赖的安装问题,这对于那些没有网络连接或者希望快速部署的Linux环境来说是非常有用的。正确安装和配置这些组件,将有助...

    nginx1.61银河麒麟V10SP1离线RPM安装包合集

    8. **服务打包**:合集中的RPM包可能包括了Nginx的核心服务、必要的依赖库以及其他配置文件,以便于一次性完成安装。 9. **系统兼容性**:针对V10SP1的定制意味着这些RPM包已经考虑到了银河麒麟操作系统的特性,...

    gcc/pcre-devel/openssl-devel/zlib-devel negix centos7依赖rpm

    在描述中提到的`rpm -Uvh ./*.rpm --nodeps --force`命令,表示我们将所有rpm包放在同一目录下,然后一次性安装。`-Uvh`参数分别代表升级(Upgrade)、显示详细信息(Verbose)和保持(Keep going)。`--nodeps`跳过...

    yum-2.0.4-1.rh.fr.i386.rpm

    这个特定的版本是2.0.4,标识为1的修订版,表明它是该版本的第一次更新。".rh.fr.i386"部分指的是这个RPM包是为Red Hat系统的法国分发版设计的,并且适用于i386架构,即32位x86处理器。 描述中同样提到"yum-2.0.4-1...

    Linux下的rpm详细用法

    对于不同 Linux 发行版之间的 rpm 文件,其兼容性问题主要取决于软件包所依赖的库以及系统架构。一般来说,来自相同发行版或相似发行版的 rpm 文件在安装时较少出现问题,但如果跨发行版安装,则可能会遇到依赖关系...

    yum-3.4.3-150.el7.centos.noarch.rpm

    基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,...

    pcre-8.40的rpm包

    使用`rpm -e pcre –nodeps`命令可以强制卸载pcre,不检查依赖关系,这样做可能会导致依赖pcre的程序运行异常。因此,描述中建议在卸载前先备份,以防止意外情况发生。 RPM是Linux系统中广泛使用的软件包管理器,...

Global site tag (gtag.js) - Google Analytics