1117
($@dd@m)
1
感觉这也算是个月经问题了。 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赞
敖律风
(敖律风)
4
放进 /usr/lib/zypper/commands 不起作用
无尽破碎
(无尽破碎)
7
我这边你的脚本取得的包名是空的,
# 我粗糙的改成了这样就好了
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赞
1117
($@dd@m)
8
检查发现是复制到论坛上的时候因为转义字符的问题丢了部分内容,已编辑修改
(为什么 \+
会被转义消失掉啊?更重要的是预览效果跟发布效果不一样啊)
hard-up
(hard-up)
9
应该把空值判断放在前面,并增加 exit 退出。
packages 包名过滤不完整。
包名推荐使用 @ 无尽破碎 的
无尽破碎
(无尽破碎)
13
更新了一下过滤部分,命令更短,也处理那个多余的 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
无尽破碎
(无尽破碎)
14
感谢楼主,,不过这命令感觉还是有些问题, 有些重复的包找不出来
~/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
wang1zhen
(Annihilation)
15
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
就能正常运作了
1117
($@dd@m)
16
「重复」的包未必是错误,可能是有不同的软件分别依赖了这两个不同版本。
zyg
(zyg)
17
的确可以,我用这个删除了 27 个包。我想问这个有没有可能把仍然被需要的包给误删了。(之前用 Ubuntu 就被 apt autoremove 坑过)
我是放在~/bin/目录下,权限 755,命名为 autoremove,即可直接运行。