在使用 Zypper 进行包管理的系统中(在我的情况下是 openSuse),如何获取与当前启用的存储库无关的所有已安装包的列表?
实际问题:升级发行版时(例如,从 openSuse 12.1 升级到 12.2),我会禁用所有已启用的非标准存储库。通常,我只是为了获取特定工具的新版本而添加它们,但默认情况下,更新后的发行版会包含该新版本。但有时,会从存储库安装其他软件包,但我不知道如何检测这些软件包。系统可以正常运行,但这些软件包永远不会更新,因为我在升级后删除了提供存储库。
答案1
这与 zypper 查询有些混乱。
1)查找来自非 opensuse-distribution-repositories 的已安装软件包:
zypper search -s | grep "i |" | grep -vi "| patch" | grep -vi "| opensuse" > list1.txt
2)查找可从 openSUSE 存储库获得的软件包(无论是否已安装):
zypper search -s | grep "v |" | grep -vi "| patch" | grep -i "| opensuse" > list2.txt
3) 找出列表 1 中未在列表 2 中出现的包:
cat list1.txt | cut -d " " -f3 | cut -d " " -f1 | while read line
do
if [ "$(cat list2.txt | grep -i $line)" = "" ]; then
echo "$line"
fi
done
这应该可以解决这个问题(在 openSUSE 11.3 上测试)。
答案2
这个选项pa
可能更合适:
zypper pa -i
列出所有已安装的软件包及其可用版本和存储库。您可以使用以下标志选择仅列出属于特定存储库的软件包-r
:
zypper pa -i -r openSUSE-12.1
从那里开始,您可以使用@ernestopheles 提出的策略来找到符合您需求的策略。
答案3
在较新版本的 openSUSE 中,您可以使用
zypper pa --orphaned
列出这些包。