我正在尝试删除一堆包含“abc”的软件包。但是,我不想删除“abc-def”。我该怎么做?
例如,如何删除除“php-common”之外的所有包含“php”的包?
我尝试添加--exclude
命令,但它没有按预期工作 - “php-common”仍然在删除列表中。
# yum --exclude=php-common remove *php*
Loaded plugins: fastestmirror
Resolving Dependencies
--> Running transaction check
---> Package php-cli.x86_64 0:5.4.16-36.el7_1 will be erased
---> Package php-common.x86_64 0:5.4.16-36.el7_1 will be erased
---> Package php-fpm.x86_64 0:5.4.16-36.el7_1 will be erased
---> Package php-mcrypt.x86_64 0:5.4.16-3.el7 will be erased
---> Package php-mysqlnd.x86_64 0:5.4.16-36.el7_1 will be erased
---> Package php-pdo.x86_64 0:5.4.16-36.el7_1 will be erased
--> Finished Dependency Resolution
yum remove *php* !php-common
,--exclude=php-common*
并且--exclude=php-common.x86_64 0:5.4.16-36.el7_1
也不起作用。
我之所以问这个问题,是因为我还有一个巨大的包(~1.5 GB)需要,但又不想因为网速慢而重新下载它。
操作系统:CentOS 7。
答案1
只需在要保留的软件包名称前加上前缀 即可-
。您需要--
在软件包列表前添加,以确保软件包名称不会被视为选项:
yum remove *php* -- -php-common
从手册页(在安装选项下):
如果名称以 - 字符开头,则会在交易中进行搜索并删除所有匹配项。
答案2
--exclude
将从存储库中排除一个包,因为它无法安装,但它不会对已安装的包起作用。
一种方法是真的保护您的软件包免于卸载的方法是将其名称放入protected_packages
,/etc/yum.conf
但yum
不会处理与该软件包匹配的通配符。
一个解决方案:
对于您的具体示例php-common
,这实际上不起作用,因为依赖项解析器会干扰,但如果依赖项不是问题,您可以尝试以下操作:
yum erase `yum list installed | cut -d " " -f 1 | grep php | grep -v php-common `
该子命令将生成已安装软件包的列表,将其剪切到第一列,将其缩减为包含php
名称的软件包,然后php-common
从列表中删除。
答案3
╮(╯_╰)╭
我昨天写了一个python来解决这个问题。
希望对你和被这个问题困扰的人有用。:-)
我在博客上记录了开发过程
http://blog.j3l11234.com/2016/11/23/yum-remove-with-exclude/
用法如下:
# ./remove.py -e *php* -x php-common
analyzing exclude packages and their dependencies ...
analyzing packages which will be removed...
Loaded plugins: fastestmirror, langpacks
Resolving Dependencies
--> Running transaction check
---> Package php-cli.x86_64 0:7.0.12-2.el7.remi will be erased
---> Package php-fpm.x86_64 0:7.0.12-2.el7.remi will be erased
---> Package php-gd.x86_64 0:7.0.12-2.el7.remi will be erased
---> Package php-mbstring.x86_64 0:7.0.12-2.el7.remi will be erased
---> Package php-mysqlnd.x86_64 0:7.0.12-2.el7.remi will be erased
---> Package php-opcache.x86_64 0:7.0.12-2.el7.remi will be erased
---> Package php-pdo.x86_64 0:7.0.12-2.el7.remi will be erased
---> Package php-xml.x86_64 0:7.0.12-2.el7.remi will be erased
--> Finished Dependency Resolution
Dependencies Resolved
==============================================================================================================
Package Arch Version Repository Size
==============================================================================================================
Removing:
php-cli x86_64 7.0.12-2.el7.remi @/php-cli-7.0.12-2.el7.remi.x86_64 12 M
php-fpm x86_64 7.0.12-2.el7.remi @/php-fpm-7.0.12-2.el7.remi.x86_64 4.1 M
php-gd x86_64 7.0.12-2.el7.remi @/php-gd-7.0.12-2.el7.remi.x86_64 203 k
php-mbstring x86_64 7.0.12-2.el7.remi @/php-mbstring-7.0.12-2.el7.remi.x86_64 2.8 M
php-mysqlnd x86_64 7.0.12-2.el7.remi @/php-mysqlnd-7.0.12-2.el7.remi.x86_64 868 k
php-opcache x86_64 7.0.12-2.el7.remi @/php-opcache-7.0.12-2.el7.remi.x86_64 396 k
php-pdo x86_64 7.0.12-2.el7.remi @/php-pdo-7.0.12-2.el7.remi.x86_64 381 k
php-xml x86_64 7.0.12-2.el7.remi @/php-xml-7.0.12-2.el7.remi.x86_64 854 k
Transaction Summary
==============================================================================================================
Remove 8 Packages
Installed size: 22 M
Is this ok [y/N]: