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


17

对于我已安装的每个软件包,我想知道如果我卸载哪些软件包。我需要的输出示例是(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-cache显示给我的不同(我不认为它包括递归依赖项):

$ 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
解析apt-get --dry-run remove看起来基本上是正确的。它可能会错过某些仅由您删除的软件包才需要的自动安装的软件包才需要的自动安装的软件包。这就是为什么您不认为这是一个合适的答案?
吉尔斯(Gilles)'所以

Answers:


11

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

要列出所有已安装的软件包,请使用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

debfoster仍然存在,但被认为是有才能的人所取代
Joshua Clayton '18

4
apt-cache show pkgname1 pkgname2...

(除其他事项外)将列出这些(运行时)依赖项。通常这是足够的,除非您将其送入机器进行进一步处理。如果您希望使用您指定的格式,则可能需要编写脚本。


抱歉,我提出的问题不正确。我想知道对于已安装的每个软件包都将卸载哪些软件包。而且我还需要列出我已安装的所有软件包。
2012年

2
@Deleted:对不起,到目前为止,我没有看到此评论。作为对“对于我已安装的每个软件包都将卸载哪些软件包”的响应(我假设您希望每个软件包都回答此问题)try apt-get remove -s packagename。列出您已安装的所有软件包就是dpkg -l
Faheem Mitha 2012年

@FaheemMitha:旧帖子,但仍然是一个不错的提示apt-get remove -s packagename
twan163

@ twan163很高兴对您有用。
Faheem Mitha 2014年

1

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

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

当然要删除标题。


2
apt-cache取决于一个recurs选项apt-cache depends --recurse libtext
Joshua Clayton
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.