列出Arch Linux上pacman的可选依赖项


23

我正在使用Arch Linux。

有没有办法列出所有已安装软件包的可选依赖项?如果是,我是否可以过滤此列表以仅查看缺少(未安装)的软件包?


1
我没有使用Arch,但是“ dependency”听起来不是可选的(其他发行版中没有)。
jordanm 2012年

AFAIK,我认为您不能立即使用pacman做到这一点。但是编写一个小的脚本来完成它是很有可能的。查询pacman以获取已安装软件包的列表。让Yaourt提取其PKGBUILD并阅读optdeps列表。pacman-git的最新版本有一个提交,指出是否已经安装了optdeps。
darnir

@jordanm:因为具有构建依赖项和可选依赖项。只有包装的某些功能才需要optdeps。因此,除非您正在使用该功能,否则您实际上并不需要大量的依赖来使系统膨胀。
darnir

我用过pacman -Qi | grep "Optional Deps" | grep -v None | grep -v installed
stewSquared

Answers:


5

您可以使用expac查询pacman数据库。

就像是:

awk 'NF>=2' <(expac "%n %O") > optdeps

它将打印您的计算机上所有已安装软件包的列表,并将optdepends每个(%O1打印到一个名为optdeps。然后,您可以根据已安装的optdepends软件包列表对此进行排序。

请参阅man expac以获取选项的完整列表。


1.这是一个大写字母O,而不是零。因为我们无法区分两者之间的字体 ...


[戳]我们现在有这样的字体。:)
muru

4

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中找到了(答案的第一部分)


3

这不是完全有效,但是会找到您想要的(颜色!):

pacman -Q > /tmp/paccache
for pkg in $(awk '{print $1}' /tmp/paccache) ; do 
   echo -n "$pkg => "; 
   for dep in $(pacman -Qi $pkg | awk -F: '/Optional Deps/{gsub(/[\<\>=].*/,"");print $NF;}' ) ; do 
       grep -q "$dep" /tmp/paccache && COLOR=32 ; echo -en "\e[1;${COLOR:-31}m${dep}\e[0;m " ; unset COLOR ; 
   done 
   echo
done 

我不太确定,但是不应该||&&之后加上grep括号,然后在行的其余部分加上括号吗?
罗德

更重要的是,这可能应该使用pacman输出的“ Optional Deps”部分而不是“ Depends On”部分。
罗德

例如xmms2pacman -Qi xmms2 | sed -n '/^Optional/,$p' | sed '/^Required/q' | head -n -1 | cut -c19- | cut -d: -f1
i336_16年

2

尽管我不得不注意到@DarkHeart的解决方案并没有真正起作用,但它启发了我开发出一种可行的解决方案。(不过没有颜色)

我正在使用 package-query,而不是@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;
}

2

这应该可以解决问题:

comm -23 <(expac -l"\n" "%o" | sort -u) <(expac -l"\n" "%n\n%S" | sort -u)

第一个输入comm列出所有可选的依赖项,第二个输入所有安装的软件包及其“提供”属性。这两个列表都已排序,并且由于以下原因仅包含每个元素一次sort -u。然后,仅显示第一行中包含的行,而不显示第二行中的行。

(编辑以合并@Archemar的建议)


0

有时您必须倒退...首先找到所有非可选的依赖项,然后与完整列表进行交叉引用,然后使用uniq。这将生成已安装的可选依赖的列表。

查找所有已安装

pacman -Q

查找所有非可选的:

pacman -Qent

因此,唯一项必须是可选的:

(pacman -Q; pacman -Qent) | sort | uniq -u 

生成缺少的可选列表取决于描述,虽然不是很漂亮,但是可以使用。

pacman -Q > /tmp/paccache; for pkg in $(awk '{print $1}' /tmp/paccache); do pacman -Qi $pkg | grep "^Optional Deps" | grep -v None >/dev/null && echo $pkg >> /tmp/hasdeps; done

for pkg in $(awk '{print $1}' /tmp/hasdeps); do echo -ne "Package: $pkg ___ "; (pacman -Qi $pkg | sed -n '/^Optional/,$p' | sed '/^Required/q' | head -n -1) | grep -v installed; echo ___; done | grep -v "___ ___" | sed -e 's/Optional Deps/ /' -e 's/___//' | sed -e 's/ \+/ /g'

0

我只在GNU sed中尝试过,但是

yay -Qi | sed -n '/Optional Deps/{:l s/.* \([a-zA-Z0-9.\-]\+\):.*/\1/p; n; /Required By/!bl}'

这工作(使用sort / uniq,如你所愿)。

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.