列出 APT 中已安装软件包的(递归)依赖关系

列出 APT 中已安装软件包的(递归)依赖关系

对于我安装的每个软件包,我想知道如果卸载它会安装哪些软件包。我需要的输出示例是 ( package: list of deps):

abc: foo bar
bcd: baz abc
bdd: baz fuubar

附加

ppp如果我检查使用以下命令删除软件包后真正会删除的内容apt-get

$ echo $(apt-get --dry-run remove ppp | grep '^Remv ' | cut -d' ' -f2)
gnome-ppp mint-meta-xfce network-manager-pptp-gnome network-manager-pptp wvdial pppoeconf pppoe pptp-linux pppconfig ppp

我发现它与apt-cacheshow 给我的不同(我认为不包括递归依赖项):

$ apt-cache show ppp | grep '^Breaks: '
Breaks: network-manager (<= 0.8.0.999-1), network-manager-pptp (<= 0.8.0.999-1), pppdcapiplugin (<= 1:3.9.20060704+dfsg.1-1)

附录2

是否有dpkg --get-selections | cut -f1可靠的方法来获取已安装软件包的列表以进行迭代?

答案1

您在这里问了几个不同的问题,我希望我至少能帮助一两个。

要列出所有已安装的软件包,请使用dpkg在字段分隔列表中输出

dpkg -l 

只需获取包列表,无需额外字段,以便您可以将其通过管道传输到其他地方。

dpkg -l | awk '{print $2 }' # Pipe to grep after the awk, or glob from dpkg

例如,如果我想删除旧内核,

apt-get purge `dpkg -l linux* | awk '{print $2}' | grep 3.0.0-12`

遍历所有不需要的依赖项的最简单方法是使用debfoster.它以交互方式运行,并遍历您想要的内容及其依赖项,并可以删除或列出非递归依赖项。

要列出特定包的所有递归依赖项,

debfoster -d $PACKAGE ## PACKAGE is the specific package.

执行后,debfoster您可以检查包还具有的任何依赖项,

debfoster -e $PACKAGE ## PACKAGE is the specific package.

列出“孤立”包的一个非常好的方法是使用deborphan.不带选项运行deborphan,它将列出所有“孤立”包。 “孤儿”是一个不依赖任何东西的包,并且您没有明确安装。

我还喜欢在全新安装后清理所有“孤立”的软件包。在我删除特定的软件包后,您可以通过以下方式获取错过的任何内容apt-get autoremove --purge

apt-get purge `deborphan`

最后,有时您不这样做--purge,最终会得到包“剩余物”,新版本apt-get可以自动删除它们。要从已运行的已卸载软件包中删除所有“剩余”,

apt-get autoclean

如果您没有新版本的apt-get,您可以随时使用这些命令删除它们。如果不存在“剩余”文件,它们会出错,似乎自动清理偶尔会丢失一些文件。

dpkg --list |grep "^rc" | cut -d " " -f 3 | xargs dpkg --purge

答案2

apt-cache show pkgname1 pkgname2...

将(除其他外)列出这些(运行时)依赖项。这通常就足够了,除非您将其送入机器进行进一步加工。如果您希望它完全符合您所说的格式,您可能需要编写一个脚本。

答案3

我认为你必须继续并为同一件事创建一个循环:

apt-cache depends libtext-wrapi18n-perl |xargs apt-cache depends

当然删除标题。

相关内容