我知道设置install_weak_deps=False
进去后/etc/dnf/dnf.conf
可以让你以后使用dnf安装程序时不安装弱依赖包。
但是,在设置此选项之前如何列出所有已安装的软件包?
我想删除整个系统中作为弱依赖项安装的所有软件包。
答案1
如果包 A 在不存在依赖项 B 的情况下仍能正常工作,则只能在包 A 的规范文件中使用弱依赖项。这意味着软件包 A 只是“建议”安装软件包 B。
无法可靠地确定包 B 是否曾是弱依赖性(因此被 A 拉入)后B已经安装好了。除非您有权访问完整的 yum/dnf 日志文件并且愿意仔细研究它们!
这是因为 B 可能是手动安装的,或者作为包 C 的弱依赖项,或者包 D 的硬依赖项(“require”)。
答案2
你无法获得精确的列表。
但是,您可以通过一些相对简单的脚本进行消除来获得合理的近似值。
dnf repoquery --userinstalled
将列出从 DNF 角度手动安装的所有软件包(这与实际上出于多种原因手动安装,但它与我们的目的并不特别相关)。
dnf repoquery --installed
列出所有已安装的软件包。
dnf repoquery --requires pkg
列出 的硬依赖项pkg
。
dnf repoquery --whatprovides pkg
可以将上述命令的输出转换--requires
为特定的包。
使用这四个命令,您可以使用以下 shell 脚本生成所有未手动安装且未显式依赖的包的大致列表:
#!/bin/bash
# Get the list of all installed packages
installed="$(dnf repoquery --installed)"
# Generate a list of all hard dependencies by iterating over each dependency of each installed package.
required=""
for pkg in ${installed}; do
for dep in $(dnf repoquery --requires "${pkg}"); do
required="${required}\n$(dnf repoquery --whatprovides "${dep}")"
done
# Remove any duplicates from the list of hard dependencies (done each time we finish a package’s dependencies to minimize memory usage).
required="$(echo "${required}" | sort -u)"
done
# Iterate over each manually installed and explicitly required package, removing them from the list of all installed packages
notrequired="${installed}"
for pkg in $(dnf repoquery --userinstalled) ${required}; do
notrequired="$(echo "${notrequired}" | grep -v "${pkg}")"
done
# Print the final list of packages that are not required.
echo "${notrequired}"
不幸的是,这将需要一段时间长的运行时间(即使是全新安装,也需要几分钟的时间),并且可能会使用相当多的内存。它最终打印出的软件包列表是 DNF 认为您自己没有安装的所有内容,这也不是任何已安装软件包的硬依赖项。这不是确切地与作为软依赖项安装的软件包列表相同,因为:
- 有些东西最初可能是作为软依赖项引入的,但要么是后来手动安装的,要么是后来安装的包的硬依赖项。
- 您实际上可以更改 DNF 认为给定的软件包是手动安装还是自动安装。
- 这可能导致通过安装一个组来拉入的软件包也被列出(我不确定,因为我只是不使用组)。