列出 APT 中已安装包的(递归)依赖项

Del*_*ted 19 apt

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

abc: foo bar
bcd: baz abc
bdd: baz fuubar
Run Code Online (Sandbox Code Playgroud)

附加

如果我检查如果我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
Run Code Online (Sandbox Code Playgroud)

我看到它与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)
Run Code Online (Sandbox Code Playgroud)

附加 2

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

J. *_*ker 12

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

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

dpkg -l 
Run Code Online (Sandbox Code Playgroud)

只获取包列表,没有额外的字段,这样你就可以在其他地方用管道把它传送出去。

dpkg -l | awk '{print $2 }' # Pipe to grep after the awk, or glob from dpkg
Run Code Online (Sandbox Code Playgroud)

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

apt-get purge `dpkg -l linux* | awk '{print $2}' | grep 3.0.0-12`
Run Code Online (Sandbox Code Playgroud)

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

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

debfoster -d $PACKAGE ## PACKAGE is the specific package.
Run Code Online (Sandbox Code Playgroud)

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

debfoster -e $PACKAGE ## PACKAGE is the specific package.
Run Code Online (Sandbox Code Playgroud)

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

我还喜欢在全新安装后清理任何“孤立”包。在我删除了特定的包之后,你可以得到任何遗漏的东西apt-get autoremove --purge

apt-get purge `deborphan`
Run Code Online (Sandbox Code Playgroud)

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

apt-get autoclean
Run Code Online (Sandbox Code Playgroud)

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

dpkg --list |grep "^rc" | cut -d " " -f 3 | xargs dpkg --purge
Run Code Online (Sandbox Code Playgroud)


Fah*_*tha 4

apt-cache show pkgname1 pkgname2...
Run Code Online (Sandbox Code Playgroud)

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

  • @Deleted:抱歉,直到现在我才看到这条评论。为了响应“我安装的每个软件包将卸载哪些软件包”(我假设您希望在每个软件包的基础上回答这个问题),请尝试“apt-get remove -s packagename”。列出您已安装的所有软件包只需“dpkg -l”。 (2认同)