我正在使用 arch linux。
有没有办法列出所有已安装软件包的可选依赖项?如果是,我可以过滤此列表以仅查看丢失(未安装)的软件包吗?
答案1
AUR 存储库 (aur/pacdep) 中有一个很好的实用程序。
pacdep 有很多选项 - 仅举一个例子 - 查找“thunar-archive-plugin”的可选包:
> pacdep -oppp thunar-archive-plugin
[...]
Optional dependencies: 6.16 MiB
extra/file-roller 3.89 MiB
extra/kdeutils-ark 1.12 MiB
community/xarchiver 1.16 MiB
[...]
上面的输出意味着没有安装任何可选包。安装“xarchiver”后,输出如下所示
[...]
Optional dependencies: 6.16 MiB
local: 1.16 MiB
xarchiver 1.16 MiB
sync: 5.01 MiB
extra/file-roller 3.89 MiB
extra/kdeutils-ark 1.12 MiB
[...]
我发现这个答案(第一部分)
http://mywaytoarch.tumblr.com/post/34979742718/easily-list-package-dependencies
答案2
答案3
这应该可以解决问题:
comm -23 <(expac -l"\n" "%o" | sort -u) <(expac -l"\n" "%n\n%S" | sort -u)
第一个输入comm
列出所有可选依赖项,第二个输入所有已安装的软件包及其“提供”属性。由于 ,两个列表均已排序并且每个元素仅包含一次sort -u
。然后仅显示包含在第一个列表中但不包含在第二个列表中的行。
(编辑以纳入@Archemar 的建议)
答案4
虽然我不得不注意到@DarkHeart 的解决方案并没有真正起作用,但它启发了我制作一个可行的解决方案。 (不过没有颜色)
我在用着包查询,一个类似的工具,而不是 @jasonwryan 建议的 expac,因为我已经安装了它(它是 yaourt 的依赖项)。将其更改为使用 expac 应该很简单。
所有可选依赖项的列表主要是通过调用 package-query 来完成的。第一个 for 循环删除了解释,因此只保留了可选依赖项的包名称;第二个 for 循环在打印第二行中的结果之前删除第一行中已安装的依赖项。
#!/usr/bin/perl
use strict;
use warnings;
my %deps;
for (`package-query -Q -f'%n %O'`) {
$deps{ (/^(\S+)/)[0] } = [/(\S+):/g];
}
my @pkgs = keys %deps;
for my $pkg (@pkgs) {
my @missing_deps = grep { !($_ ~~ @pkgs) } @{ $deps{$pkg} };
print "$pkg => @missing_deps\n" if @missing_deps;
}