分享一个使用 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

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

11赞

这不支持一下?虽然我确实没啥需求好像……

1赞

脚本无效啊

放进 /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

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

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

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

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

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