分享一个使用 zypper 实现 autoremove 的方法

感觉这也算是个月经问题了。 zypper 确实没有直接提供类似于其他包管理器的 autoremove 的功能,但是有这样的一个命令可以列出当前已被自动安装但未被其他包依赖的无用软件包:

zypper pa --unneeded

于是就可以将此命令的输出经过一番管道操作喂给 zypper rm -u 来删除这些多余的软件包,比如这样

zypper pa --unneeded | sed '1,/^[-+]\+$/d' | cut -d \| -f 3 | xargs sudo zypper rm -u

刚好 zypper 提供了 subcommand 子命令的功能,可以将自定义脚本当作 zypper 命令来执行。所以可以编写这样一个脚本

#!/bin/sh

packages=$(zypper -tqn --no-refresh pa --unneeded|sed '1,/^[-+]\+$/d'|cut -d \| -f 3)

if [ "$packages" ]; then
  sudo zypper --no-refresh rm -u $packages
else
  echo No unneeded package found.
fi

命名为 zypper-autoremove,放在你的 $PATH 下或者 /usr/lib/zypper/commands 里面,就可以通过

zypper autoremove

命令来实现清理无用包的功能了。

18赞

脚本无效啊

放进 /usr/lib/zypper/commands 不起作用

脚本加可执行权限了吗?

加了,755

我这边你的脚本取得的包名是空的,

# 我粗糙的改成了这样就好了 
zypper -tqn --no-refresh pa --unneeded| grep '|' |grep -v 'Repos->' |awk -F "|" '{print $3}'
S | Repos-> | Name                          | Version                        | Arch
--+---------+-------------------------------+--------------------------------+-------
i | @System | gcc9-info                     | 9.3.1+git1684-3.2              | noarch
i | @System | go1.14                        | 1.14.15-1.3                    | x86_64
i | @System | google-roboto-slab-fonts      | 0~git20200304-1.3              | noarch
i | @System | iproute2-arpd                 | 5.11-1.1                       | x86_64
i | @System | libSDL2_image-2_0-0           | 2.0.5-1.8                      | x86_64
i | @System | libavdevice57                 | 3.4.8-5.3                      | x86_64
i | @System | libavformat56                 | 2.8.17-2.4                     | x86_64
i | @System | libc++1                       | 11.0.1-3.2                     | x86_64
i | @System | liblua5_1-5                   | 5.1.5-15.9                     | x86_64
i | @System | libmalcontent-ui-0-0          | 0.9.0-3.4                      | x86_64
i | @System | libmbedtls13                  | 2.25.0-2.3                     | x86_64
i | @System | libstdc++6-pp-gcc9            | 9.3.1+git1684-3.2              | x86_64
i | @System | libx264-159                   | 0.159+git20191127.1771b556-3.1 | x86_64
i | @System | libx264-160                   | 0.160+git20200702.cde9a933-1.9 | x86_64
i | @System | libx265-188                   | 3.3-1.3                        | x86_64
i | @System | pam-deprecated                | 1.5.1-3.3                      | x86_64
i | @System | perl-Clone                    | 0.45-1.6                       | x86_64
i | @System | postfix-ldap                  | 3.5.9-4.1                      | x86_64
i | @System | qemu-chardev-baum             | 5.2.0-10.3                     | x86_64
i | @System | qemu-hw-s390x-virtio-gpu-ccw  | 5.2.0-10.3                     | x86_64
i | @System | qemu-ivshmem-tools            | 5.2.0-10.3                     | x86_64
i | @System | raleway-fonts                 | 3.0-4.16                       | noarch
i | @System | ruby2.7-rubygem-mini_portile2 | 2.5.0-1.5                      | x86_64
i | @System | sane-saned                    | 1.0.32-1.2                     | x86_64
1赞

检查发现是复制到论坛上的时候因为转义字符的问题丢了部分内容,已编辑修改

(为什么 \+ 会被转义消失掉啊?更重要的是预览效果跟发布效果不一样啊)

应该把空值判断放在前面,并增加 exit 退出。
packages 包名过滤不完整。
包名推荐使用 @ 无尽破碎 的

包名过滤后,第一行为 name,应该删除第一行

支持下,有时候还是有这个需求的

这个确实是个月经贴,好东西,收藏一下,谢谢

更新了一下过滤部分,命令更短,也处理那个多余的 Name

zypper -tqn --no-refresh pa --unneeded |grep '^i |' |awk -F "|" '{print $3}' |xargs sudo zypper rm -u

zypper-autoremove.sh

#!/bin/sh

# sudo cp zypper-autoremove.sh /usr/lib/zypper/commands/zypper-autoremove
# sudo zypper autoremove

packages=$(zypper -tqn --no-refresh pa --unneeded |grep '^i |' |awk -F "|" '{print $3}')

if [ "$packages" ]; then
  sudo zypper rm -u $packages
else
  echo No unneeded package found.
fi

感谢楼主,,不过这命令感觉还是有些问题, 有些重复的包找不出来

~/D/cache $ zypper -tqn --no-refresh pa --unneeded                                                                        12s 127ms 
~/D/cache $                                                                                                                   956ms 
~/D/cache $ rpm -qa|grep -i x265                                                                                              956ms 
libx265-199-3.5-2.26.x86_64
libx265-179-3.2.1-3.10.x86_64
~/D/cache $ rpm -qa|grep -i x264                                                                                            1s 89ms 
libx264-161-0.161+git20200912.d198931a-2.29.x86_64
~/D/cache $                                                                                                                1s 119ms
sudo zypper rm -u $packages

得到的格式并不对,

No provider of 'cpp11

libibmtss1
libjemalloc2
python38-rpm' found.

改成

packages=$(zypper -tqn --no-refresh packages --unneeded | grep '^i |' | awk -F "|" '{print $3}')
        if [[ -n "$packages" ]]
        then
                echo $packages | xargs sudo zypper remove --clean-deps
        else
                echo "No unneeded package found."
        fi

就能正常运作了

「重复」的包未必是错误,可能是有不同的软件分别依赖了这两个不同版本。

的确可以,我用这个删除了 27 个包。我想问这个有没有可能把仍然被需要的包给误删了。(之前用 Ubuntu 就被 apt autoremove 坑过)
我是放在~/bin/目录下,权限 755,命名为 autoremove,即可直接运行。